mod_profile/mod_profile.lua
author Kim Alvefur <zash@zash.se>
Fri, 04 Feb 2022 21:22:10 +0100
changeset 4887 68bd8ae9b827
parent 3326 682b05b4017e
permissions -rw-r--r--
mod_pubsub_feeds: Allow but ignore XML comments and processing instructions This should allow but ignore them, which should be safe.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
-- mod_profile
3189
973caebcb40b mod_profile: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 3188
diff changeset
     2
-- Copyright (C) 2014-2018 Kim Alvefur
973caebcb40b mod_profile: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 3188
diff changeset
     3
--
973caebcb40b mod_profile: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 3188
diff changeset
     4
-- This file is MIT licensed.
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
local st = require"util.stanza";
1747
8fbe16c83807 mod_profile: Don't use import()
Kim Alvefur <zash@zash.se>
parents: 1516
diff changeset
     7
local jid_split = require"util.jid".split;
8fbe16c83807 mod_profile: Don't use import()
Kim Alvefur <zash@zash.se>
parents: 1516
diff changeset
     8
local jid_bare = require"util.jid".bare;
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
local is_admin = require"core.usermanager".is_admin;
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
local vcard = require"util.vcard";
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
local base64 = require"util.encodings".base64;
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
local sha1 = require"util.hashes".sha1;
1451
843769eb40c3 mod_profile: Don't include photo in vCard4 version (use XEP-0084 instead)
Kim Alvefur <zash@zash.se>
parents: 1442
diff changeset
    13
local t_insert, t_remove = table.insert, table.remove;
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
local pep_plus;
1420
808950ab007b mod_profile: Integrate with mod_pep_plus by default
Kim Alvefur <zash@zash.se>
parents: 1419
diff changeset
    16
if module:get_host_type() == "local" and module:get_option_boolean("vcard_to_pep", true) then
3211
149cc5ddc64f mod_profile: Update for mod_pep_plus rename
Kim Alvefur <zash@zash.se>
parents: 3198
diff changeset
    17
	pep_plus = module:depends"pep";
3212
e55172ce68d4 mod_profile: Abort if mod_pep doesn't appear to be the former mod_pep_plus
Kim Alvefur <zash@zash.se>
parents: 3211
diff changeset
    18
	assert(pep_plus.get_pep_service, "Wrong version of mod_pep loaded, you need to update Prosody");
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
end
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    21
local storage = module:open_store();
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    22
local legacy_storage = module:open_store("vcard");
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
3190
1fe5b156d220 mod_profile: Add support for XEP-0398
Kim Alvefur <zash@zash.se>
parents: 3189
diff changeset
    24
module:hook("account-disco-info", function (event)
1fe5b156d220 mod_profile: Add support for XEP-0398
Kim Alvefur <zash@zash.se>
parents: 3189
diff changeset
    25
	event.reply:tag("feature", { var = "urn:xmpp:pep-vcard-conversion:0" }):up();
1fe5b156d220 mod_profile: Add support for XEP-0398
Kim Alvefur <zash@zash.se>
parents: 3189
diff changeset
    26
end);
1fe5b156d220 mod_profile: Add support for XEP-0398
Kim Alvefur <zash@zash.se>
parents: 3189
diff changeset
    27
3185
1f2272cda0d7 mod_profile: Ignore shadowed variable name
Kim Alvefur <zash@zash.se>
parents: 2794
diff changeset
    28
local function get_item(vcard, name) -- luacheck: ignore 431
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    29
	local item;
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    30
	for i=1, #vcard do
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
		item=vcard[i];
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
		if item.name == name then
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
			return item, i;
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    34
		end
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    35
	end
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    36
end
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
local magic_mime = {
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
	["\137PNG\r\n\026\n"] = "image/png";
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
	["\255\216"] = "image/jpeg";
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    41
	["GIF87a"] = "image/gif";
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
	["GIF89a"] = "image/gif";
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    43
	["<?xml"] = "image/svg+xml";
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
}
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    45
local function identify(data)
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    46
	for magic, mime in pairs(magic_mime) do
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    47
		if data:sub(1, #magic) == magic then
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    48
			return mime;
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    49
		end
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    50
	end
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    51
	return "application/octet-stream";
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    52
end
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    53
3194
76a2aca48b4f mod_profile: Refactor wrapping of payloads in <item>
Kim Alvefur <zash@zash.se>
parents: 3191
diff changeset
    54
local function item_container(id, payload)
3250
2a54b331f011 mod_profile: Pass item id onto pubsub container element
Kim Alvefur <zash@zash.se>
parents: 3249
diff changeset
    55
	return id, st.stanza("item", { id = id or "current", xmlns = "http://jabber.org/protocol/pubsub"; })
3194
76a2aca48b4f mod_profile: Refactor wrapping of payloads in <item>
Kim Alvefur <zash@zash.se>
parents: 3191
diff changeset
    56
		:add_child(payload);
76a2aca48b4f mod_profile: Refactor wrapping of payloads in <item>
Kim Alvefur <zash@zash.se>
parents: 3191
diff changeset
    57
end
76a2aca48b4f mod_profile: Refactor wrapping of payloads in <item>
Kim Alvefur <zash@zash.se>
parents: 3191
diff changeset
    58
1515
f367d7cbfaa6 mod_profile: Use module:handle_items() for PEP node bootstrapping (see trunk 388786af0dd2)
Kim Alvefur <zash@zash.se>
parents: 1503
diff changeset
    59
local function update_pep(username, data, pep)
2794
5163f7905371 mod_profile: Update get_pep_service() signature to match recent changes to mod_pep_plus (in trunk)
Kim Alvefur <zash@zash.se>
parents: 2417
diff changeset
    60
	pep = pep or pep_plus.get_pep_service(username);
1451
843769eb40c3 mod_profile: Don't include photo in vCard4 version (use XEP-0084 instead)
Kim Alvefur <zash@zash.se>
parents: 1442
diff changeset
    61
	local photo, p = get_item(data, "PHOTO");
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    62
	if vcard.to_vcard4 then
1451
843769eb40c3 mod_profile: Don't include photo in vCard4 version (use XEP-0084 instead)
Kim Alvefur <zash@zash.se>
parents: 1442
diff changeset
    63
		if p then t_remove(data, p); end
3325
628659e2e6b0 Backed out changeset 395835d89d88: Might still be needed
Kim Alvefur <zash@zash.se>
parents: 3256
diff changeset
    64
		pep:purge("urn:xmpp:vcard4", true)
3194
76a2aca48b4f mod_profile: Refactor wrapping of payloads in <item>
Kim Alvefur <zash@zash.se>
parents: 3191
diff changeset
    65
		pep:publish("urn:xmpp:vcard4", true, item_container("current", vcard.to_vcard4(data)));
1451
843769eb40c3 mod_profile: Don't include photo in vCard4 version (use XEP-0084 instead)
Kim Alvefur <zash@zash.se>
parents: 1442
diff changeset
    66
		if p then t_insert(data, p, photo); end
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    67
	end
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    68
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    69
	local nickname = get_item(data, "NICKNAME");
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    70
	if nickname and nickname[1] then
3325
628659e2e6b0 Backed out changeset 395835d89d88: Might still be needed
Kim Alvefur <zash@zash.se>
parents: 3256
diff changeset
    71
		pep:purge("http://jabber.org/protocol/nick", true);
3194
76a2aca48b4f mod_profile: Refactor wrapping of payloads in <item>
Kim Alvefur <zash@zash.se>
parents: 3191
diff changeset
    72
		pep:publish("http://jabber.org/protocol/nick", true, item_container("current",
76a2aca48b4f mod_profile: Refactor wrapping of payloads in <item>
Kim Alvefur <zash@zash.se>
parents: 3191
diff changeset
    73
			st.stanza("nick", { xmlns="http://jabber.org/protocol/nick" }):text(nickname[1])));
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    74
	end
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    75
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    76
	if photo and photo[1] then
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    77
		local photo_raw = base64.decode(photo[1]);
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    78
		local photo_hash = sha1(photo_raw, true);
3249
1d57f485efef mod_profile: Use type property over content identifiguesstimation
Kim Alvefur <zash@zash.se>
parents: 3212
diff changeset
    79
		local photo_type = photo.TYPE and photo.TYPE[1];
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    80
3325
628659e2e6b0 Backed out changeset 395835d89d88: Might still be needed
Kim Alvefur <zash@zash.se>
parents: 3256
diff changeset
    81
		pep:purge("urn:xmpp:avatar:metadata", true);
628659e2e6b0 Backed out changeset 395835d89d88: Might still be needed
Kim Alvefur <zash@zash.se>
parents: 3256
diff changeset
    82
		pep:purge("urn:xmpp:avatar:data", true);
3194
76a2aca48b4f mod_profile: Refactor wrapping of payloads in <item>
Kim Alvefur <zash@zash.se>
parents: 3191
diff changeset
    83
		pep:publish("urn:xmpp:avatar:metadata", true, item_container(photo_hash,
76a2aca48b4f mod_profile: Refactor wrapping of payloads in <item>
Kim Alvefur <zash@zash.se>
parents: 3191
diff changeset
    84
			st.stanza("metadata", { xmlns="urn:xmpp:avatar:metadata" })
1469
019746bba318 mod_profile: Add the missing <info> child element and move info attributes there
Kim Alvefur <zash@zash.se>
parents: 1451
diff changeset
    85
				:tag("info", {
019746bba318 mod_profile: Add the missing <info> child element and move info attributes there
Kim Alvefur <zash@zash.se>
parents: 1451
diff changeset
    86
					bytes = tostring(#photo_raw),
019746bba318 mod_profile: Add the missing <info> child element and move info attributes there
Kim Alvefur <zash@zash.se>
parents: 1451
diff changeset
    87
					id = photo_hash,
3249
1d57f485efef mod_profile: Use type property over content identifiguesstimation
Kim Alvefur <zash@zash.se>
parents: 3212
diff changeset
    88
					type = photo_type or identify(photo_raw),
3194
76a2aca48b4f mod_profile: Refactor wrapping of payloads in <item>
Kim Alvefur <zash@zash.se>
parents: 3191
diff changeset
    89
				})));
76a2aca48b4f mod_profile: Refactor wrapping of payloads in <item>
Kim Alvefur <zash@zash.se>
parents: 3191
diff changeset
    90
		pep:publish("urn:xmpp:avatar:data", true, item_container(photo_hash,
76a2aca48b4f mod_profile: Refactor wrapping of payloads in <item>
Kim Alvefur <zash@zash.se>
parents: 3191
diff changeset
    91
			st.stanza("data", { xmlns="urn:xmpp:avatar:data" }):text(photo[1])));
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    92
	end
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    93
end
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    94
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    95
-- The "temporary" vCard XEP-0054 part
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    96
module:add_feature("vcard-temp");
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    97
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    98
local function handle_get(event)
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    99
	local origin, stanza = event.origin, event.stanza;
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   100
	local username = origin.username;
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   101
	local to = stanza.attr.to;
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   102
	if to then username = jid_split(to); end
1749
851cb0b3d584 mod_profile: Return error on storage error, don't attempt to migrate from old storage
Kim Alvefur <zash@zash.se>
parents: 1748
diff changeset
   103
	local data, err = storage:get(username);
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   104
	if not data then
1749
851cb0b3d584 mod_profile: Return error on storage error, don't attempt to migrate from old storage
Kim Alvefur <zash@zash.se>
parents: 1748
diff changeset
   105
		if err then
851cb0b3d584 mod_profile: Return error on storage error, don't attempt to migrate from old storage
Kim Alvefur <zash@zash.se>
parents: 1748
diff changeset
   106
			origin.send(st.error_reply(stanza, "cancel", "internal-server-error", err));
851cb0b3d584 mod_profile: Return error on storage error, don't attempt to migrate from old storage
Kim Alvefur <zash@zash.se>
parents: 1748
diff changeset
   107
			return true;
851cb0b3d584 mod_profile: Return error on storage error, don't attempt to migrate from old storage
Kim Alvefur <zash@zash.se>
parents: 1748
diff changeset
   108
		end
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   109
		data = legacy_storage:get(username);
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   110
		data = data and st.deserialize(data);
1441
07c9306c2c1f mod_profile: Don't pass old vcard data trough vcard lib
Kim Alvefur <zash@zash.se>
parents: 1424
diff changeset
   111
		if data then
1748
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   112
			origin.send(st.reply(stanza):add_child(data));
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   113
			return true;
1441
07c9306c2c1f mod_profile: Don't pass old vcard data trough vcard lib
Kim Alvefur <zash@zash.se>
parents: 1424
diff changeset
   114
		end
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   115
	end
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   116
	if not data then
1748
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   117
		origin.send(st.error_reply(stanza, "cancel", "item-not-found"));
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   118
		return true;
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   119
	end
1748
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   120
	origin.send(st.reply(stanza):add_child(vcard.to_xep54(data)));
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   121
	return true;
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   122
end
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   123
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   124
local function handle_set(event)
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   125
	local origin, stanza = event.origin, event.stanza;
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   126
	local data = vcard.from_xep54(stanza.tags[1]);
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   127
	local username = origin.username;
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   128
	local to = stanza.attr.to;
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   129
	if to then
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   130
		if not is_admin(jid_bare(stanza.attr.from), module.host) then
1748
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   131
			origin.send(st.error_reply(stanza, "auth", "forbidden"));
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   132
			return true;
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   133
		end
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   134
		username = jid_split(to);
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   135
	end
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   136
	local ok, err = storage:set(username, data);
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   137
	if not ok then
1748
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   138
		origin.send(st.error_reply(stanza, "cancel", "internal-server-error", err));
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   139
		return true;
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   140
	end
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   141
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   142
	if pep_plus and username then
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   143
		update_pep(username, data);
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   144
	end
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   145
1748
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   146
	origin.send(st.reply(stanza));
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   147
	return true;
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   148
end
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   149
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   150
module:hook("iq-get/bare/vcard-temp:vCard", handle_get);
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   151
module:hook("iq-get/host/vcard-temp:vCard", handle_get);
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   152
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   153
module:hook("iq-set/bare/vcard-temp:vCard", handle_set);
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   154
module:hook("iq-set/host/vcard-temp:vCard", handle_set);
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   155
1516
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   156
local function on_publish(event)
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   157
	if event.actor == true then return end -- Not from a client
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   158
	local node, item = event.node, event.item;
2417
b64c0150d663 mod_profile: Add warning and debug logging in order to catch a weird event
Kim Alvefur <zash@zash.se>
parents: 1749
diff changeset
   159
	local username, host = jid_split(event.actor);
b64c0150d663 mod_profile: Add warning and debug logging in order to catch a weird event
Kim Alvefur <zash@zash.se>
parents: 1749
diff changeset
   160
	if host ~= module.host then
b64c0150d663 mod_profile: Add warning and debug logging in order to catch a weird event
Kim Alvefur <zash@zash.se>
parents: 1749
diff changeset
   161
		module:log("warn", "on_publish() called for non-local actor");
b64c0150d663 mod_profile: Add warning and debug logging in order to catch a weird event
Kim Alvefur <zash@zash.se>
parents: 1749
diff changeset
   162
		for k,v in pairs(event) do
3188
c25853bc387b mod_profile: Fix typo
Kim Alvefur <zash@zash.se>
parents: 3185
diff changeset
   163
			module:log("debug", "event[%q] = %q", k, v);
2417
b64c0150d663 mod_profile: Add warning and debug logging in order to catch a weird event
Kim Alvefur <zash@zash.se>
parents: 1749
diff changeset
   164
		end
b64c0150d663 mod_profile: Add warning and debug logging in order to catch a weird event
Kim Alvefur <zash@zash.se>
parents: 1749
diff changeset
   165
		return;
b64c0150d663 mod_profile: Add warning and debug logging in order to catch a weird event
Kim Alvefur <zash@zash.se>
parents: 1749
diff changeset
   166
	end
1516
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   167
	local data = storage:get(username) or {};
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   168
	if node == "urn:xmpp:avatar:data" then
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   169
		local new_photo = item:get_child_text("data", "urn:xmpp:avatar:data");
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   170
		new_photo = new_photo and { name = "PHOTO"; ENCODING = { "b" }; new_photo } or nil;
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   171
		local _, i = get_item(data, "PHOTO")
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   172
		if new_photo then
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   173
			data[i or #data+1] = new_photo;
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   174
		elseif i then
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   175
			table.remove(data, i);
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   176
		end
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   177
	elseif node == "http://jabber.org/protocol/nick" then
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   178
		local new_nick = item:get_child_text("nick", "http://jabber.org/protocol/nick");
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   179
		new_nick = new_nick and new_nick ~= "" and { name = "NICKNAME"; new_nick } or nil;
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   180
		local _, i = get_item(data, "NICKNAME")
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   181
		if new_nick then
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   182
			data[i or #data+1] = new_nick;
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   183
		elseif i then
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   184
			table.remove(data, i);
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   185
		end
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   186
	else
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   187
		return;
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   188
	end
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   189
	storage:set(username, data);
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   190
end
48d95ab404c7 mod_profile: Save photo and nickname from PEP to vCard
Kim Alvefur <zash@zash.se>
parents: 1515
diff changeset
   191
1515
f367d7cbfaa6 mod_profile: Use module:handle_items() for PEP node bootstrapping (see trunk 388786af0dd2)
Kim Alvefur <zash@zash.se>
parents: 1503
diff changeset
   192
local function pep_service_added(event)
f367d7cbfaa6 mod_profile: Use module:handle_items() for PEP node bootstrapping (see trunk 388786af0dd2)
Kim Alvefur <zash@zash.se>
parents: 1503
diff changeset
   193
	local item = event.item;
f367d7cbfaa6 mod_profile: Use module:handle_items() for PEP node bootstrapping (see trunk 388786af0dd2)
Kim Alvefur <zash@zash.se>
parents: 1503
diff changeset
   194
	local service, username = item.service, jid_split(item.jid);
3326
682b05b4017e mod_profile: Fix PEP event handler to detach on unload
Kim Alvefur <zash@zash.se>
parents: 3325
diff changeset
   195
	module:hook_object_event(service.events, "item-published", on_publish);
1515
f367d7cbfaa6 mod_profile: Use module:handle_items() for PEP node bootstrapping (see trunk 388786af0dd2)
Kim Alvefur <zash@zash.se>
parents: 1503
diff changeset
   196
	local data = storage:get(username);
f367d7cbfaa6 mod_profile: Use module:handle_items() for PEP node bootstrapping (see trunk 388786af0dd2)
Kim Alvefur <zash@zash.se>
parents: 1503
diff changeset
   197
	if data then
f367d7cbfaa6 mod_profile: Use module:handle_items() for PEP node bootstrapping (see trunk 388786af0dd2)
Kim Alvefur <zash@zash.se>
parents: 1503
diff changeset
   198
		update_pep(username, data, service);
1442
253e374824a8 mod_profile: Load profile into PEP on initial presence
Kim Alvefur <zash@zash.se>
parents: 1441
diff changeset
   199
	end
1515
f367d7cbfaa6 mod_profile: Use module:handle_items() for PEP node bootstrapping (see trunk 388786af0dd2)
Kim Alvefur <zash@zash.se>
parents: 1503
diff changeset
   200
end
f367d7cbfaa6 mod_profile: Use module:handle_items() for PEP node bootstrapping (see trunk 388786af0dd2)
Kim Alvefur <zash@zash.se>
parents: 1503
diff changeset
   201
f367d7cbfaa6 mod_profile: Use module:handle_items() for PEP node bootstrapping (see trunk 388786af0dd2)
Kim Alvefur <zash@zash.se>
parents: 1503
diff changeset
   202
local function pep_service_removed()
f367d7cbfaa6 mod_profile: Use module:handle_items() for PEP node bootstrapping (see trunk 388786af0dd2)
Kim Alvefur <zash@zash.se>
parents: 1503
diff changeset
   203
	-- This would happen when mod_pep_plus gets unloaded, but this module gets unloaded before that
f367d7cbfaa6 mod_profile: Use module:handle_items() for PEP node bootstrapping (see trunk 388786af0dd2)
Kim Alvefur <zash@zash.se>
parents: 1503
diff changeset
   204
end
f367d7cbfaa6 mod_profile: Use module:handle_items() for PEP node bootstrapping (see trunk 388786af0dd2)
Kim Alvefur <zash@zash.se>
parents: 1503
diff changeset
   205
f367d7cbfaa6 mod_profile: Use module:handle_items() for PEP node bootstrapping (see trunk 388786af0dd2)
Kim Alvefur <zash@zash.se>
parents: 1503
diff changeset
   206
function module.load()
f367d7cbfaa6 mod_profile: Use module:handle_items() for PEP node bootstrapping (see trunk 388786af0dd2)
Kim Alvefur <zash@zash.se>
parents: 1503
diff changeset
   207
	module:handle_items("pep-service", pep_service_added, pep_service_removed, true);
f367d7cbfaa6 mod_profile: Use module:handle_items() for PEP node bootstrapping (see trunk 388786af0dd2)
Kim Alvefur <zash@zash.se>
parents: 1503
diff changeset
   208
end
1442
253e374824a8 mod_profile: Load profile into PEP on initial presence
Kim Alvefur <zash@zash.se>
parents: 1441
diff changeset
   209
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   210
-- The vCard4 part
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   211
if vcard.to_vcard4 then
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   212
	module:add_feature("urn:ietf:params:xml:ns:vcard-4.0");
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   213
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   214
	module:hook("iq-get/bare/urn:ietf:params:xml:ns:vcard-4.0:vcard", function(event)
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   215
		local origin, stanza = event.origin, event.stanza;
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   216
		local username = jid_split(stanza.attr.to) or origin.username;
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   217
		local data = storage:get(username);
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   218
		if not data then
1748
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   219
			origin.send(st.error_reply(stanza, "cancel", "item-not-found"));
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   220
			return true;
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   221
		end
1748
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   222
		origin.send(st.reply(stanza):add_child(vcard.to_vcard4(data)));
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   223
		return true;
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   224
	end);
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   225
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   226
	if vcard.from_vcard4 then
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   227
		module:hook("iq-set/self/urn:ietf:params:xml:ns:vcard-4.0:vcard", function(event)
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   228
			local origin, stanza = event.origin, event.stanza;
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   229
			local ok, err = storage:set(origin.username, vcard.from_vcard4(stanza.tags[1]));
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   230
			if not ok then
1748
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   231
				origin.send(st.error_reply(stanza, "cancel", "internal-server-error", err));
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   232
				return true;
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   233
			end
1748
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   234
			origin.send(st.reply(stanza));
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   235
			return true;
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   236
		end);
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   237
	else
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   238
		module:hook("iq-set/self/urn:ietf:params:xml:ns:vcard-4.0:vcard", function(event)
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   239
			local origin, stanza = event.origin, event.stanza;
1748
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   240
			origin.send(st.error_reply(stanza, "cancel", "feature-not-implemented"));
fbef84033fae mod_profile: Explicitly return true from handlers, session.send can return nil under some conditions
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
   241
			return true;
1419
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   242
		end);
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   243
	end
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   244
end
877dc87539ff mod_profile: Replacement for mod_vcard with vcard4 support and integration with mod_pep_plus
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   245
3190
1fe5b156d220 mod_profile: Add support for XEP-0398
Kim Alvefur <zash@zash.se>
parents: 3189
diff changeset
   246
local function inject_xep153(event)
1fe5b156d220 mod_profile: Add support for XEP-0398
Kim Alvefur <zash@zash.se>
parents: 3189
diff changeset
   247
	local origin, stanza = event.origin, event.stanza;
1fe5b156d220 mod_profile: Add support for XEP-0398
Kim Alvefur <zash@zash.se>
parents: 3189
diff changeset
   248
	local username = origin.username;
3191
7c450c27d4ba mod_profile: Skip injecting xep153 into presence for sessions with no username
Kim Alvefur <zash@zash.se>
parents: 3190
diff changeset
   249
	if not username then return end
3190
1fe5b156d220 mod_profile: Add support for XEP-0398
Kim Alvefur <zash@zash.se>
parents: 3189
diff changeset
   250
	local pep = pep_plus.get_pep_service(username);
1fe5b156d220 mod_profile: Add support for XEP-0398
Kim Alvefur <zash@zash.se>
parents: 3189
diff changeset
   251
3255
60821653c5a9 mod_profile: Only retrieve the last avatar hash from PEP
Kim Alvefur <zash@zash.se>
parents: 3250
diff changeset
   252
	local ok, avatar_hash = pep:get_last_item("urn:xmpp:avatar:metadata", true);
60821653c5a9 mod_profile: Only retrieve the last avatar hash from PEP
Kim Alvefur <zash@zash.se>
parents: 3250
diff changeset
   253
	if ok and avatar_hash then
3256
eec70a863d16 mod_profile: Only replace avatar update hash if one is found
Kim Alvefur <zash@zash.se>
parents: 3255
diff changeset
   254
		stanza:remove_children("x", "vcard-temp:x:update");
eec70a863d16 mod_profile: Only replace avatar update hash if one is found
Kim Alvefur <zash@zash.se>
parents: 3255
diff changeset
   255
		local x_update = st.stanza("x", { xmlns = "vcard-temp:x:update" });
3255
60821653c5a9 mod_profile: Only retrieve the last avatar hash from PEP
Kim Alvefur <zash@zash.se>
parents: 3250
diff changeset
   256
		x_update:text_tag("photo", avatar_hash);
3256
eec70a863d16 mod_profile: Only replace avatar update hash if one is found
Kim Alvefur <zash@zash.se>
parents: 3255
diff changeset
   257
		stanza:add_direct_child(x_update);
3190
1fe5b156d220 mod_profile: Add support for XEP-0398
Kim Alvefur <zash@zash.se>
parents: 3189
diff changeset
   258
	end
1fe5b156d220 mod_profile: Add support for XEP-0398
Kim Alvefur <zash@zash.se>
parents: 3189
diff changeset
   259
end
1fe5b156d220 mod_profile: Add support for XEP-0398
Kim Alvefur <zash@zash.se>
parents: 3189
diff changeset
   260
1fe5b156d220 mod_profile: Add support for XEP-0398
Kim Alvefur <zash@zash.se>
parents: 3189
diff changeset
   261
if pep_plus then
3197
92d80b6ce375 mod_profile: Bump priority of xep153 hook to surely run before mod_presence
Kim Alvefur <zash@zash.se>
parents: 3196
diff changeset
   262
	module:hook("pre-presence/full", inject_xep153, 1)
92d80b6ce375 mod_profile: Bump priority of xep153 hook to surely run before mod_presence
Kim Alvefur <zash@zash.se>
parents: 3196
diff changeset
   263
	module:hook("pre-presence/bare", inject_xep153, 1)
92d80b6ce375 mod_profile: Bump priority of xep153 hook to surely run before mod_presence
Kim Alvefur <zash@zash.se>
parents: 3196
diff changeset
   264
	module:hook("pre-presence/host", inject_xep153, 1)
3190
1fe5b156d220 mod_profile: Add support for XEP-0398
Kim Alvefur <zash@zash.se>
parents: 3189
diff changeset
   265
end