plugins/mod_vcard_legacy.lua
author Kim Alvefur <zash@zash.se>
Mon, 12 Dec 2022 07:03:31 +0100
branch0.11
changeset 12802 c4b1b5cbc20b
parent 10273 4701415f5b0e
child 10274 c2b9ff42db03
permissions -rw-r--r--
Tag 0.11.14
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9815
ce6eb482eb50 mod_vcard_legacy: Add some missing semicolons
Kim Alvefur <zash@zash.se>
parents: 9814
diff changeset
     1
local st = require "util.stanza";
9252
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
local jid_split = require "util.jid".split;
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
local mod_pep = module:depends("pep");
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
9258
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
     6
local sha1 = require "util.hashes".sha1;
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
     7
local base64_decode = require "util.encodings".base64.decode;
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
     8
9259
12d3d96e3918 mod_vcard_legacy: Respond with old vcard
Kim Alvefur <zash@zash.se>
parents: 9258
diff changeset
     9
local vcards = module:open_store("vcard");
12d3d96e3918 mod_vcard_legacy: Respond with old vcard
Kim Alvefur <zash@zash.se>
parents: 9258
diff changeset
    10
9252
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
module:add_feature("vcard-temp");
9263
0fc6ffc57dc0 mod_vcard_legacy: Announce feature on bare JID per XEP
Kim Alvefur <zash@zash.se>
parents: 9262
diff changeset
    12
module:hook("account-disco-info", function (event)
0fc6ffc57dc0 mod_vcard_legacy: Announce feature on bare JID per XEP
Kim Alvefur <zash@zash.se>
parents: 9262
diff changeset
    13
	event.reply:tag("feature", { var = "urn:xmpp:pep-vcard-conversion:0" }):up();
0fc6ffc57dc0 mod_vcard_legacy: Announce feature on bare JID per XEP
Kim Alvefur <zash@zash.se>
parents: 9262
diff changeset
    14
end);
9252
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
9271
628b99811301 mod_vcard_legacy: Factor out error handling into a function
Kim Alvefur <zash@zash.se>
parents: 9270
diff changeset
    16
local function handle_error(origin, stanza, err)
628b99811301 mod_vcard_legacy: Factor out error handling into a function
Kim Alvefur <zash@zash.se>
parents: 9270
diff changeset
    17
	if err == "forbidden" then
628b99811301 mod_vcard_legacy: Factor out error handling into a function
Kim Alvefur <zash@zash.se>
parents: 9270
diff changeset
    18
		origin.send(st.error_reply(stanza, "auth", "forbidden"));
628b99811301 mod_vcard_legacy: Factor out error handling into a function
Kim Alvefur <zash@zash.se>
parents: 9270
diff changeset
    19
	elseif err == "internal-server-error" then
628b99811301 mod_vcard_legacy: Factor out error handling into a function
Kim Alvefur <zash@zash.se>
parents: 9270
diff changeset
    20
		origin.send(st.error_reply(stanza, "wait", "internal-server-error"));
628b99811301 mod_vcard_legacy: Factor out error handling into a function
Kim Alvefur <zash@zash.se>
parents: 9270
diff changeset
    21
	else
628b99811301 mod_vcard_legacy: Factor out error handling into a function
Kim Alvefur <zash@zash.se>
parents: 9270
diff changeset
    22
		origin.send(st.error_reply(stanza, "modify", "undefined-condition", err));
628b99811301 mod_vcard_legacy: Factor out error handling into a function
Kim Alvefur <zash@zash.se>
parents: 9270
diff changeset
    23
	end
628b99811301 mod_vcard_legacy: Factor out error handling into a function
Kim Alvefur <zash@zash.se>
parents: 9270
diff changeset
    24
end
628b99811301 mod_vcard_legacy: Factor out error handling into a function
Kim Alvefur <zash@zash.se>
parents: 9270
diff changeset
    25
9252
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
-- Simple translations
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    27
-- <foo><text>hey</text></foo> -> <FOO>hey</FOO>
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    28
local simple_map = {
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    29
	nickname = "text";
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    30
	title = "text";
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
	role = "text";
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
	categories = "text";
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
	note = "text";
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    34
	url = "uri";
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    35
	bday = "date";
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    36
}
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
module:hook("iq-get/bare/vcard-temp:vCard", function (event)
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
	local origin, stanza = event.origin, event.stanza;
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
	local pep_service = mod_pep.get_pep_service(jid_split(stanza.attr.to) or origin.username);
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    41
	local ok, id, vcard4_item = pep_service:get_last_item("urn:xmpp:vcard4", stanza.attr.from);
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    43
	local vcard_temp = st.stanza("vCard", { xmlns = "vcard-temp" });
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
	if ok and vcard4_item then
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    45
		local vcard4 = vcard4_item.tags[1];
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    46
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    47
		local fn = vcard4:get_child("fn");
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    48
		vcard_temp:text_tag("FN", fn and fn:get_child_text("text"));
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    49
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    50
		local v4n = vcard4:get_child("n");
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    51
		vcard_temp:tag("N")
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    52
			:text_tag("FAMILY", v4n and v4n:get_child_text("surname"))
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    53
			:text_tag("GIVEN", v4n and v4n:get_child_text("given"))
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    54
			:text_tag("MIDDLE", v4n and v4n:get_child_text("additional"))
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
			:text_tag("PREFIX", v4n and v4n:get_child_text("prefix"))
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    56
			:text_tag("SUFFIX", v4n and v4n:get_child_text("suffix"))
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    57
			:up();
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    58
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    59
		for tag in vcard4:childtags() do
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    60
			local typ = simple_map[tag.name];
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    61
			if typ then
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    62
				local text = tag:get_child_text(typ);
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    63
				if text then
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    64
					vcard_temp:text_tag(tag.name:upper(), text);
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    65
				end
9254
3f31e10e8256 mod_vcard_legacy: Add translation of email field
Kim Alvefur <zash@zash.se>
parents: 9253
diff changeset
    66
			elseif tag.name == "email" then
3f31e10e8256 mod_vcard_legacy: Add translation of email field
Kim Alvefur <zash@zash.se>
parents: 9253
diff changeset
    67
				local text = tag:get_child_text("text");
3f31e10e8256 mod_vcard_legacy: Add translation of email field
Kim Alvefur <zash@zash.se>
parents: 9253
diff changeset
    68
				if text then
3f31e10e8256 mod_vcard_legacy: Add translation of email field
Kim Alvefur <zash@zash.se>
parents: 9253
diff changeset
    69
					vcard_temp:tag("EMAIL")
3f31e10e8256 mod_vcard_legacy: Add translation of email field
Kim Alvefur <zash@zash.se>
parents: 9253
diff changeset
    70
						:text_tag("USERID", text)
3f31e10e8256 mod_vcard_legacy: Add translation of email field
Kim Alvefur <zash@zash.se>
parents: 9253
diff changeset
    71
						:tag("INTERNET"):up();
3f31e10e8256 mod_vcard_legacy: Add translation of email field
Kim Alvefur <zash@zash.se>
parents: 9253
diff changeset
    72
					if tag:find"parameters/type/text#" == "home" then
3f31e10e8256 mod_vcard_legacy: Add translation of email field
Kim Alvefur <zash@zash.se>
parents: 9253
diff changeset
    73
						vcard_temp:tag("HOME"):up();
3f31e10e8256 mod_vcard_legacy: Add translation of email field
Kim Alvefur <zash@zash.se>
parents: 9253
diff changeset
    74
					elseif tag:find"parameters/type/text#" == "work" then
3f31e10e8256 mod_vcard_legacy: Add translation of email field
Kim Alvefur <zash@zash.se>
parents: 9253
diff changeset
    75
						vcard_temp:tag("WORK"):up();
3f31e10e8256 mod_vcard_legacy: Add translation of email field
Kim Alvefur <zash@zash.se>
parents: 9253
diff changeset
    76
					end
3f31e10e8256 mod_vcard_legacy: Add translation of email field
Kim Alvefur <zash@zash.se>
parents: 9253
diff changeset
    77
					vcard_temp:up();
3f31e10e8256 mod_vcard_legacy: Add translation of email field
Kim Alvefur <zash@zash.se>
parents: 9253
diff changeset
    78
				end
9255
292d283c7694 mod_vcard_legacy: Add translation of telephone field
Kim Alvefur <zash@zash.se>
parents: 9254
diff changeset
    79
			elseif tag.name == "tel" then
292d283c7694 mod_vcard_legacy: Add translation of telephone field
Kim Alvefur <zash@zash.se>
parents: 9254
diff changeset
    80
				local text = tag:get_child_text("uri");
292d283c7694 mod_vcard_legacy: Add translation of telephone field
Kim Alvefur <zash@zash.se>
parents: 9254
diff changeset
    81
				if text then
292d283c7694 mod_vcard_legacy: Add translation of telephone field
Kim Alvefur <zash@zash.se>
parents: 9254
diff changeset
    82
					if text:sub(1, 4) == "tel:" then
292d283c7694 mod_vcard_legacy: Add translation of telephone field
Kim Alvefur <zash@zash.se>
parents: 9254
diff changeset
    83
						text = text:sub(5)
292d283c7694 mod_vcard_legacy: Add translation of telephone field
Kim Alvefur <zash@zash.se>
parents: 9254
diff changeset
    84
					end
292d283c7694 mod_vcard_legacy: Add translation of telephone field
Kim Alvefur <zash@zash.se>
parents: 9254
diff changeset
    85
					vcard_temp:tag("TEL"):text_tag("NUMBER", text);
292d283c7694 mod_vcard_legacy: Add translation of telephone field
Kim Alvefur <zash@zash.se>
parents: 9254
diff changeset
    86
					if tag:find"parameters/type/text#" == "home" then
292d283c7694 mod_vcard_legacy: Add translation of telephone field
Kim Alvefur <zash@zash.se>
parents: 9254
diff changeset
    87
						vcard_temp:tag("HOME"):up();
292d283c7694 mod_vcard_legacy: Add translation of telephone field
Kim Alvefur <zash@zash.se>
parents: 9254
diff changeset
    88
					elseif tag:find"parameters/type/text#" == "work" then
292d283c7694 mod_vcard_legacy: Add translation of telephone field
Kim Alvefur <zash@zash.se>
parents: 9254
diff changeset
    89
						vcard_temp:tag("WORK"):up();
292d283c7694 mod_vcard_legacy: Add translation of telephone field
Kim Alvefur <zash@zash.se>
parents: 9254
diff changeset
    90
					end
292d283c7694 mod_vcard_legacy: Add translation of telephone field
Kim Alvefur <zash@zash.se>
parents: 9254
diff changeset
    91
					vcard_temp:up();
292d283c7694 mod_vcard_legacy: Add translation of telephone field
Kim Alvefur <zash@zash.se>
parents: 9254
diff changeset
    92
				end
9257
2ffbcad8ec50 mod_vcard_legacy: Add support for address field
Kim Alvefur <zash@zash.se>
parents: 9256
diff changeset
    93
			elseif tag.name == "adr" then
2ffbcad8ec50 mod_vcard_legacy: Add support for address field
Kim Alvefur <zash@zash.se>
parents: 9256
diff changeset
    94
				vcard_temp:tag("ADR")
2ffbcad8ec50 mod_vcard_legacy: Add support for address field
Kim Alvefur <zash@zash.se>
parents: 9256
diff changeset
    95
					:text_tag("POBOX", tag:get_child_text("pobox"))
2ffbcad8ec50 mod_vcard_legacy: Add support for address field
Kim Alvefur <zash@zash.se>
parents: 9256
diff changeset
    96
					:text_tag("EXTADD", tag:get_child_text("ext"))
2ffbcad8ec50 mod_vcard_legacy: Add support for address field
Kim Alvefur <zash@zash.se>
parents: 9256
diff changeset
    97
					:text_tag("STREET", tag:get_child_text("street"))
2ffbcad8ec50 mod_vcard_legacy: Add support for address field
Kim Alvefur <zash@zash.se>
parents: 9256
diff changeset
    98
					:text_tag("LOCALITY", tag:get_child_text("locality"))
2ffbcad8ec50 mod_vcard_legacy: Add support for address field
Kim Alvefur <zash@zash.se>
parents: 9256
diff changeset
    99
					:text_tag("REGION", tag:get_child_text("region"))
2ffbcad8ec50 mod_vcard_legacy: Add support for address field
Kim Alvefur <zash@zash.se>
parents: 9256
diff changeset
   100
					:text_tag("PCODE", tag:get_child_text("code"))
2ffbcad8ec50 mod_vcard_legacy: Add support for address field
Kim Alvefur <zash@zash.se>
parents: 9256
diff changeset
   101
					:text_tag("CTRY", tag:get_child_text("country"));
2ffbcad8ec50 mod_vcard_legacy: Add support for address field
Kim Alvefur <zash@zash.se>
parents: 9256
diff changeset
   102
				if tag:find"parameters/type/text#" == "home" then
2ffbcad8ec50 mod_vcard_legacy: Add support for address field
Kim Alvefur <zash@zash.se>
parents: 9256
diff changeset
   103
					vcard_temp:tag("HOME"):up();
2ffbcad8ec50 mod_vcard_legacy: Add support for address field
Kim Alvefur <zash@zash.se>
parents: 9256
diff changeset
   104
				elseif tag:find"parameters/type/text#" == "work" then
2ffbcad8ec50 mod_vcard_legacy: Add support for address field
Kim Alvefur <zash@zash.se>
parents: 9256
diff changeset
   105
					vcard_temp:tag("WORK"):up();
2ffbcad8ec50 mod_vcard_legacy: Add support for address field
Kim Alvefur <zash@zash.se>
parents: 9256
diff changeset
   106
				end
2ffbcad8ec50 mod_vcard_legacy: Add support for address field
Kim Alvefur <zash@zash.se>
parents: 9256
diff changeset
   107
				vcard_temp:up();
9252
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   108
			end
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   109
		end
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   110
	end
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   111
9256
dbe3ae6f9746 mod_vcard_legacy: Include avatar data from XEP-0084 PEP node
Kim Alvefur <zash@zash.se>
parents: 9255
diff changeset
   112
	local meta_ok, avatar_meta = pep_service:get_items("urn:xmpp:avatar:metadata", stanza.attr.from);
dbe3ae6f9746 mod_vcard_legacy: Include avatar data from XEP-0084 PEP node
Kim Alvefur <zash@zash.se>
parents: 9255
diff changeset
   113
	local data_ok, avatar_data = pep_service:get_items("urn:xmpp:avatar:data", stanza.attr.from);
9276
f2258e9750cf mod_vcard_legacy: Include avatar data even if metadata can't be loaded
Kim Alvefur <zash@zash.se>
parents: 9275
diff changeset
   114
f2258e9750cf mod_vcard_legacy: Include avatar data even if metadata can't be loaded
Kim Alvefur <zash@zash.se>
parents: 9275
diff changeset
   115
	if data_ok then
f2258e9750cf mod_vcard_legacy: Include avatar data even if metadata can't be loaded
Kim Alvefur <zash@zash.se>
parents: 9275
diff changeset
   116
		for _, hash in ipairs(avatar_data) do
f2258e9750cf mod_vcard_legacy: Include avatar data even if metadata can't be loaded
Kim Alvefur <zash@zash.se>
parents: 9275
diff changeset
   117
			local meta = meta_ok and avatar_meta[hash];
9256
dbe3ae6f9746 mod_vcard_legacy: Include avatar data from XEP-0084 PEP node
Kim Alvefur <zash@zash.se>
parents: 9255
diff changeset
   118
			local data = avatar_data[hash];
9260
05bd21c122ae mod_vcard_legacy: Handle incomplete avatar info
Kim Alvefur <zash@zash.se>
parents: 9259
diff changeset
   119
			local info = meta and meta.tags[1]:get_child("info");
05bd21c122ae mod_vcard_legacy: Handle incomplete avatar info
Kim Alvefur <zash@zash.se>
parents: 9259
diff changeset
   120
			vcard_temp:tag("PHOTO");
05bd21c122ae mod_vcard_legacy: Handle incomplete avatar info
Kim Alvefur <zash@zash.se>
parents: 9259
diff changeset
   121
			if info and info.attr.type then
05bd21c122ae mod_vcard_legacy: Handle incomplete avatar info
Kim Alvefur <zash@zash.se>
parents: 9259
diff changeset
   122
				vcard_temp:text_tag("TYPE", info.attr.type);
05bd21c122ae mod_vcard_legacy: Handle incomplete avatar info
Kim Alvefur <zash@zash.se>
parents: 9259
diff changeset
   123
			end
05bd21c122ae mod_vcard_legacy: Handle incomplete avatar info
Kim Alvefur <zash@zash.se>
parents: 9259
diff changeset
   124
			if data then
05bd21c122ae mod_vcard_legacy: Handle incomplete avatar info
Kim Alvefur <zash@zash.se>
parents: 9259
diff changeset
   125
				vcard_temp:text_tag("BINVAL", data.tags[1]:get_text());
9261
0cc535668fce mod_vcard_legacy: Support external avatars
Kim Alvefur <zash@zash.se>
parents: 9260
diff changeset
   126
			elseif info and info.attr.url then
9288
78673e81243f mod_vcard_legacy: Fix EXTVAL conversion (thanks pep.)
Kim Alvefur <zash@zash.se>
parents: 9287
diff changeset
   127
				vcard_temp:text_tag("EXTVAL", info.attr.url);
9260
05bd21c122ae mod_vcard_legacy: Handle incomplete avatar info
Kim Alvefur <zash@zash.se>
parents: 9259
diff changeset
   128
			end
05bd21c122ae mod_vcard_legacy: Handle incomplete avatar info
Kim Alvefur <zash@zash.se>
parents: 9259
diff changeset
   129
			vcard_temp:up();
9256
dbe3ae6f9746 mod_vcard_legacy: Include avatar data from XEP-0084 PEP node
Kim Alvefur <zash@zash.se>
parents: 9255
diff changeset
   130
		end
dbe3ae6f9746 mod_vcard_legacy: Include avatar data from XEP-0084 PEP node
Kim Alvefur <zash@zash.se>
parents: 9255
diff changeset
   131
	end
dbe3ae6f9746 mod_vcard_legacy: Include avatar data from XEP-0084 PEP node
Kim Alvefur <zash@zash.se>
parents: 9255
diff changeset
   132
9252
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   133
	origin.send(st.reply(stanza):add_child(vcard_temp));
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   134
	return true;
506aabdb13bc mod_vcard_legacy: Responds to vcard-temp queries with translated vcard4 data
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   135
end);
9253
9a8006f9e983 mod_vcard_legacy: Attach vcard-temp avatar hash to outgoing presence
Kim Alvefur <zash@zash.se>
parents: 9252
diff changeset
   136
9521
a62fa766d8f3 mod_vcard_legacy: Create nodes with open access (fixes #1221)
Kim Alvefur <zash@zash.se>
parents: 9289
diff changeset
   137
local node_defaults = {
a62fa766d8f3 mod_vcard_legacy: Create nodes with open access (fixes #1221)
Kim Alvefur <zash@zash.se>
parents: 9289
diff changeset
   138
	access_model = "open";
a62fa766d8f3 mod_vcard_legacy: Create nodes with open access (fixes #1221)
Kim Alvefur <zash@zash.se>
parents: 9289
diff changeset
   139
	_defaults_only = true;
a62fa766d8f3 mod_vcard_legacy: Create nodes with open access (fixes #1221)
Kim Alvefur <zash@zash.se>
parents: 9289
diff changeset
   140
};
a62fa766d8f3 mod_vcard_legacy: Create nodes with open access (fixes #1221)
Kim Alvefur <zash@zash.se>
parents: 9289
diff changeset
   141
9812
00d210deea28 mod_vcard_legacy: Factor out conversion from vcard-temp to 4
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
   142
function vcard_to_pep(vcard_temp)
00d210deea28 mod_vcard_legacy: Factor out conversion from vcard-temp to 4
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
   143
	local avatars = {};
9258
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   144
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   145
	local vcard4 = st.stanza("item", { xmlns = "http://jabber.org/protocol/pubsub", id = "current" })
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   146
		:tag("vcard", { xmlns = 'urn:ietf:params:xml:ns:vcard-4.0' });
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   147
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   148
	vcard4:tag("fn"):text_tag("text", vcard_temp:get_child_text("FN")):up();
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   149
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   150
	local N = vcard_temp:get_child("N");
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   151
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   152
	vcard4:tag("n")
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   153
		:text_tag("surname", N and N:get_child_text("FAMILY"))
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   154
		:text_tag("given", N and N:get_child_text("GIVEN"))
9287
161f604e14fa mod_vcard_legacy: Fix uppercase tag name (thanks pep.)
Kim Alvefur <zash@zash.se>
parents: 9276
diff changeset
   155
		:text_tag("additional", N and N:get_child_text("MIDDLE"))
9258
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   156
		:text_tag("prefix", N and N:get_child_text("PREFIX"))
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   157
		:text_tag("suffix", N and N:get_child_text("SUFFIX"))
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   158
	:up();
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   159
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   160
	for tag in vcard_temp:childtags() do
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   161
		local typ = simple_map[tag.name:lower()];
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   162
		if typ then
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   163
			local text = tag:get_text();
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   164
			if text then
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   165
				vcard4:tag(tag.name:lower()):text_tag(typ, text):up();
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   166
			end
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   167
		elseif tag.name == "EMAIL" then
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   168
			local text = tag:get_child_text("USERID");
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   169
			if text then
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   170
				vcard4:tag("email")
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   171
				vcard4:text_tag("text", text)
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   172
				vcard4:tag("parameters"):tag("type");
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   173
				if tag:get_child("HOME") then
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   174
					vcard4:text_tag("text", "home");
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   175
				elseif tag:get_child("WORK") then
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   176
					vcard4:text_tag("text", "work");
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   177
				end
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   178
				vcard4:up():up():up();
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   179
			end
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   180
		elseif tag.name == "TEL" then
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   181
			local text = tag:get_child_text("NUMBER");
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   182
			if text then
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   183
				vcard4:tag("tel"):text_tag("uri", "tel:"..text);
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   184
			end
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   185
			vcard4:tag("parameters"):tag("type");
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   186
			if tag:get_child("HOME") then
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   187
				vcard4:text_tag("text", "home");
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   188
			elseif tag:get_child("WORK") then
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   189
				vcard4:text_tag("text", "work");
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   190
			end
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   191
			vcard4:up():up():up();
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   192
		elseif tag.name == "ORG" then
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   193
			local text = tag:get_child_text("ORGNAME");
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   194
			if text then
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   195
				vcard4:tag("org"):text_tag("text", text):up();
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   196
			end
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   197
		elseif tag.name == "DESC" then
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   198
			local text = tag:get_text();
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   199
			if text then
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   200
				vcard4:tag("note"):text_tag("text", text):up();
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   201
			end
9289
992e986589b8 mod_vcard_legacy: Add some notes
Kim Alvefur <zash@zash.se>
parents: 9288
diff changeset
   202
			-- <note> gets mapped into <NOTE> in the other direction
9258
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   203
		elseif tag.name == "ADR" then
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   204
			vcard4:tag("adr")
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   205
				:text_tag("pobox", tag:get_child_text("POBOX"))
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   206
				:text_tag("ext", tag:get_child_text("EXTADD"))
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   207
				:text_tag("street", tag:get_child_text("STREET"))
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   208
				:text_tag("locality", tag:get_child_text("LOCALITY"))
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   209
				:text_tag("region", tag:get_child_text("REGION"))
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   210
				:text_tag("code", tag:get_child_text("PCODE"))
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   211
				:text_tag("country", tag:get_child_text("CTRY"));
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   212
			vcard4:tag("parameters"):tag("type");
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   213
			if tag:get_child("HOME") then
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   214
				vcard4:text_tag("text", "home");
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   215
			elseif tag:get_child("WORK") then
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   216
				vcard4:text_tag("text", "work");
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   217
			end
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   218
			vcard4:up():up():up();
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   219
		elseif tag.name == "PHOTO" then
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   220
			local avatar_type = tag:get_child_text("TYPE");
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   221
			local avatar_payload = tag:get_child_text("BINVAL");
9289
992e986589b8 mod_vcard_legacy: Add some notes
Kim Alvefur <zash@zash.se>
parents: 9288
diff changeset
   222
			-- Can EXTVAL be translated? No way to know the sha1 of the data?
9258
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   223
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   224
			if avatar_payload then
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   225
				local avatar_raw = base64_decode(avatar_payload);
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   226
				local avatar_hash = sha1(avatar_raw, true);
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   227
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   228
				local avatar_meta = st.stanza("item", { id = avatar_hash, xmlns = "http://jabber.org/protocol/pubsub" })
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   229
					:tag("metadata", { xmlns="urn:xmpp:avatar:metadata" })
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   230
						:tag("info", {
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   231
							bytes = tostring(#avatar_raw),
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   232
							id = avatar_hash,
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   233
							type = avatar_type,
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   234
						});
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   235
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   236
				local avatar_data = st.stanza("item", { id = avatar_hash, xmlns = "http://jabber.org/protocol/pubsub" })
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   237
					:tag("data", { xmlns="urn:xmpp:avatar:data" })
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   238
						:text(avatar_payload);
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   239
9812
00d210deea28 mod_vcard_legacy: Factor out conversion from vcard-temp to 4
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
   240
				table.insert(avatars, { hash = avatar_hash, meta = avatar_meta, data = avatar_data });
9258
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   241
			end
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   242
		end
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   243
	end
9812
00d210deea28 mod_vcard_legacy: Factor out conversion from vcard-temp to 4
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
   244
	return vcard4, avatars;
00d210deea28 mod_vcard_legacy: Factor out conversion from vcard-temp to 4
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
   245
end
9258
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   246
9812
00d210deea28 mod_vcard_legacy: Factor out conversion from vcard-temp to 4
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
   247
function save_to_pep(pep_service, actor, vcard4, avatars)
9818
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   248
	if avatars then
9812
00d210deea28 mod_vcard_legacy: Factor out conversion from vcard-temp to 4
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
   249
9818
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   250
		if pep_service:purge("urn:xmpp:avatar:metadata", actor) then
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   251
			pep_service:purge("urn:xmpp:avatar:data", actor);
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   252
		end
9812
00d210deea28 mod_vcard_legacy: Factor out conversion from vcard-temp to 4
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
   253
9818
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   254
		local avatar_defaults = node_defaults;
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   255
		if #avatars > 1 then
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   256
			avatar_defaults = {};
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   257
			for k,v in pairs(node_defaults) do
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   258
				avatar_defaults[k] = v;
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   259
			end
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   260
			avatar_defaults.max_items = #avatars;
9813
5648e8733569 mod_vcard_legacy: Adapt node defaults to number of avatars
Kim Alvefur <zash@zash.se>
parents: 9812
diff changeset
   261
		end
9818
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   262
		for _, avatar in ipairs(avatars) do
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   263
			local ok, err = pep_service:publish("urn:xmpp:avatar:data", actor, avatar.hash, avatar.data, avatar_defaults);
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   264
			if ok then
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   265
				ok, err = pep_service:publish("urn:xmpp:avatar:metadata", actor, avatar.hash, avatar.meta, avatar_defaults);
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   266
			end
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   267
			if not ok then
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   268
				return ok, err;
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   269
			end
9812
00d210deea28 mod_vcard_legacy: Factor out conversion from vcard-temp to 4
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
   270
		end
00d210deea28 mod_vcard_legacy: Factor out conversion from vcard-temp to 4
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
   271
	end
00d210deea28 mod_vcard_legacy: Factor out conversion from vcard-temp to 4
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
   272
9818
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   273
	if vcard4 then
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   274
		return pep_service:publish("urn:xmpp:vcard4", actor, "current", vcard4, node_defaults);
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   275
	end
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   276
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   277
	return true;
9812
00d210deea28 mod_vcard_legacy: Factor out conversion from vcard-temp to 4
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
   278
end
00d210deea28 mod_vcard_legacy: Factor out conversion from vcard-temp to 4
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
   279
00d210deea28 mod_vcard_legacy: Factor out conversion from vcard-temp to 4
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
   280
module:hook("iq-set/self/vcard-temp:vCard", function (event)
00d210deea28 mod_vcard_legacy: Factor out conversion from vcard-temp to 4
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
   281
	local origin, stanza = event.origin, event.stanza;
00d210deea28 mod_vcard_legacy: Factor out conversion from vcard-temp to 4
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
   282
	local pep_service = mod_pep.get_pep_service(origin.username);
00d210deea28 mod_vcard_legacy: Factor out conversion from vcard-temp to 4
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
   283
00d210deea28 mod_vcard_legacy: Factor out conversion from vcard-temp to 4
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
   284
	local vcard_temp = stanza.tags[1];
00d210deea28 mod_vcard_legacy: Factor out conversion from vcard-temp to 4
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
   285
00d210deea28 mod_vcard_legacy: Factor out conversion from vcard-temp to 4
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
   286
	local ok, err = save_to_pep(pep_service, origin.full_jid, vcard_to_pep(vcard_temp));
9258
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   287
	if ok then
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   288
		origin.send(st.reply(stanza));
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   289
	else
9271
628b99811301 mod_vcard_legacy: Factor out error handling into a function
Kim Alvefur <zash@zash.se>
parents: 9270
diff changeset
   290
		handle_error(origin, stanza, err);
9258
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   291
	end
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   292
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   293
	return true;
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   294
end);
2aa40526df7b mod_vcard_legacy: Respond to attempts to set the legacy vcard-temp
Kim Alvefur <zash@zash.se>
parents: 9257
diff changeset
   295
9253
9a8006f9e983 mod_vcard_legacy: Attach vcard-temp avatar hash to outgoing presence
Kim Alvefur <zash@zash.se>
parents: 9252
diff changeset
   296
local function inject_xep153(event)
9a8006f9e983 mod_vcard_legacy: Attach vcard-temp avatar hash to outgoing presence
Kim Alvefur <zash@zash.se>
parents: 9252
diff changeset
   297
	local origin, stanza = event.origin, event.stanza;
9a8006f9e983 mod_vcard_legacy: Attach vcard-temp avatar hash to outgoing presence
Kim Alvefur <zash@zash.se>
parents: 9252
diff changeset
   298
	local username = origin.username;
9a8006f9e983 mod_vcard_legacy: Attach vcard-temp avatar hash to outgoing presence
Kim Alvefur <zash@zash.se>
parents: 9252
diff changeset
   299
	if not username then return end
9676
e71484c210fb mod_vcard_legacy: Limit injection of XEP-0153 to normal presence (fixes #1252)
Kim Alvefur <zash@zash.se>
parents: 9523
diff changeset
   300
	if stanza.attr.type then return end
9273
b024fae6919e mod_vcard_legacy: Rename variable for consistency
Kim Alvefur <zash@zash.se>
parents: 9272
diff changeset
   301
	local pep_service = mod_pep.get_pep_service(username);
9253
9a8006f9e983 mod_vcard_legacy: Attach vcard-temp avatar hash to outgoing presence
Kim Alvefur <zash@zash.se>
parents: 9252
diff changeset
   302
10273
4701415f5b0e mod_vcard_legacy: Don't owerwrite empty photo elements (fixes #1432)
Kim Alvefur <zash@zash.se>
parents: 10272
diff changeset
   303
	local x_update = stanza:get_child("x", "vcard-temp:x:update");
4701415f5b0e mod_vcard_legacy: Don't owerwrite empty photo elements (fixes #1432)
Kim Alvefur <zash@zash.se>
parents: 10272
diff changeset
   304
	if not x_update then
4701415f5b0e mod_vcard_legacy: Don't owerwrite empty photo elements (fixes #1432)
Kim Alvefur <zash@zash.se>
parents: 10272
diff changeset
   305
		x_update = st.stanza("x", { xmlns = "vcard-temp:x:update" }):tag("photo");
4701415f5b0e mod_vcard_legacy: Don't owerwrite empty photo elements (fixes #1432)
Kim Alvefur <zash@zash.se>
parents: 10272
diff changeset
   306
		stanza:add_direct_child(x_update);
4701415f5b0e mod_vcard_legacy: Don't owerwrite empty photo elements (fixes #1432)
Kim Alvefur <zash@zash.se>
parents: 10272
diff changeset
   307
	elseif x_update:get_child("photo") then
4701415f5b0e mod_vcard_legacy: Don't owerwrite empty photo elements (fixes #1432)
Kim Alvefur <zash@zash.se>
parents: 10272
diff changeset
   308
		return; -- XEP implies that these should be left alone
4701415f5b0e mod_vcard_legacy: Don't owerwrite empty photo elements (fixes #1432)
Kim Alvefur <zash@zash.se>
parents: 10272
diff changeset
   309
	else
4701415f5b0e mod_vcard_legacy: Don't owerwrite empty photo elements (fixes #1432)
Kim Alvefur <zash@zash.se>
parents: 10272
diff changeset
   310
		x_update:tag("photo");
4701415f5b0e mod_vcard_legacy: Don't owerwrite empty photo elements (fixes #1432)
Kim Alvefur <zash@zash.se>
parents: 10272
diff changeset
   311
	end
9273
b024fae6919e mod_vcard_legacy: Rename variable for consistency
Kim Alvefur <zash@zash.se>
parents: 9272
diff changeset
   312
	local ok, avatar_hash = pep_service:get_last_item("urn:xmpp:avatar:metadata", true);
9253
9a8006f9e983 mod_vcard_legacy: Attach vcard-temp avatar hash to outgoing presence
Kim Alvefur <zash@zash.se>
parents: 9252
diff changeset
   313
	if ok and avatar_hash then
10272
210278d5f995 mod_vcard_legacy: Advertise lack of avatar correctly (fixes #1431) (thanks lovetox)
Kim Alvefur <zash@zash.se>
parents: 9818
diff changeset
   314
		x_update:text(avatar_hash);
9253
9a8006f9e983 mod_vcard_legacy: Attach vcard-temp avatar hash to outgoing presence
Kim Alvefur <zash@zash.se>
parents: 9252
diff changeset
   315
	end
9a8006f9e983 mod_vcard_legacy: Attach vcard-temp avatar hash to outgoing presence
Kim Alvefur <zash@zash.se>
parents: 9252
diff changeset
   316
end
9a8006f9e983 mod_vcard_legacy: Attach vcard-temp avatar hash to outgoing presence
Kim Alvefur <zash@zash.se>
parents: 9252
diff changeset
   317
9a8006f9e983 mod_vcard_legacy: Attach vcard-temp avatar hash to outgoing presence
Kim Alvefur <zash@zash.se>
parents: 9252
diff changeset
   318
module:hook("pre-presence/full", inject_xep153, 1);
9a8006f9e983 mod_vcard_legacy: Attach vcard-temp avatar hash to outgoing presence
Kim Alvefur <zash@zash.se>
parents: 9252
diff changeset
   319
module:hook("pre-presence/bare", inject_xep153, 1);
9a8006f9e983 mod_vcard_legacy: Attach vcard-temp avatar hash to outgoing presence
Kim Alvefur <zash@zash.se>
parents: 9252
diff changeset
   320
module:hook("pre-presence/host", inject_xep153, 1);
9814
2d8e2de36654 mod_vcard_legacy: Upgrade vcard-temp on login (fixes #1289)
Kim Alvefur <zash@zash.se>
parents: 9813
diff changeset
   321
9817
071aaaa5cb34 mod_vcard_legacy: Allow disabling vcard conversion
Kim Alvefur <zash@zash.se>
parents: 9816
diff changeset
   322
if module:get_option_boolean("upgrade_legacy_vcards", true) then
9814
2d8e2de36654 mod_vcard_legacy: Upgrade vcard-temp on login (fixes #1289)
Kim Alvefur <zash@zash.se>
parents: 9813
diff changeset
   323
module:hook("resource-bind", function (event)
2d8e2de36654 mod_vcard_legacy: Upgrade vcard-temp on login (fixes #1289)
Kim Alvefur <zash@zash.se>
parents: 9813
diff changeset
   324
	local session = event.session;
2d8e2de36654 mod_vcard_legacy: Upgrade vcard-temp on login (fixes #1289)
Kim Alvefur <zash@zash.se>
parents: 9813
diff changeset
   325
	local username = session.username;
2d8e2de36654 mod_vcard_legacy: Upgrade vcard-temp on login (fixes #1289)
Kim Alvefur <zash@zash.se>
parents: 9813
diff changeset
   326
	local vcard_temp = vcards:get(username);
2d8e2de36654 mod_vcard_legacy: Upgrade vcard-temp on login (fixes #1289)
Kim Alvefur <zash@zash.se>
parents: 9813
diff changeset
   327
	if not vcard_temp then
2d8e2de36654 mod_vcard_legacy: Upgrade vcard-temp on login (fixes #1289)
Kim Alvefur <zash@zash.se>
parents: 9813
diff changeset
   328
		session.log("debug", "No legacy vCard to migrate or already migrated");
2d8e2de36654 mod_vcard_legacy: Upgrade vcard-temp on login (fixes #1289)
Kim Alvefur <zash@zash.se>
parents: 9813
diff changeset
   329
		return;
2d8e2de36654 mod_vcard_legacy: Upgrade vcard-temp on login (fixes #1289)
Kim Alvefur <zash@zash.se>
parents: 9813
diff changeset
   330
	end
9816
330a937e085e mod_vcard_legacy: Don't overwrite existing PEP data
Kim Alvefur <zash@zash.se>
parents: 9815
diff changeset
   331
	local pep_service = mod_pep.get_pep_service(username);
9818
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   332
	vcard_temp = st.deserialize(vcard_temp);
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   333
	local vcard4, avatars = vcard_to_pep(vcard_temp);
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   334
	if pep_service:get_last_item("urn:xmpp:vcard4", true) then
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   335
		vcard4 = nil;
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   336
	end
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   337
	if pep_service:get_last_item("urn:xmpp:avatar:metadata", true)
9816
330a937e085e mod_vcard_legacy: Don't overwrite existing PEP data
Kim Alvefur <zash@zash.se>
parents: 9815
diff changeset
   338
	or pep_service:get_last_item("urn:xmpp:avatar:data", true) then
9818
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   339
		avatars = nil;
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   340
	end
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   341
	if not (vcard4 or avatars) then
9816
330a937e085e mod_vcard_legacy: Don't overwrite existing PEP data
Kim Alvefur <zash@zash.se>
parents: 9815
diff changeset
   342
		session.log("debug", "Already PEP data, not overwriting with migrated data");
330a937e085e mod_vcard_legacy: Don't overwrite existing PEP data
Kim Alvefur <zash@zash.se>
parents: 9815
diff changeset
   343
		vcards:set(username, nil);
330a937e085e mod_vcard_legacy: Don't overwrite existing PEP data
Kim Alvefur <zash@zash.se>
parents: 9815
diff changeset
   344
		return;
330a937e085e mod_vcard_legacy: Don't overwrite existing PEP data
Kim Alvefur <zash@zash.se>
parents: 9815
diff changeset
   345
	end
9818
5eb4ef537e98 mod_vcard_legacy: Handle partial migration
Kim Alvefur <zash@zash.se>
parents: 9817
diff changeset
   346
	local ok, err = save_to_pep(pep_service, true, vcard4, avatars);
9814
2d8e2de36654 mod_vcard_legacy: Upgrade vcard-temp on login (fixes #1289)
Kim Alvefur <zash@zash.se>
parents: 9813
diff changeset
   347
	if ok and vcards:set(username, nil) then
2d8e2de36654 mod_vcard_legacy: Upgrade vcard-temp on login (fixes #1289)
Kim Alvefur <zash@zash.se>
parents: 9813
diff changeset
   348
		session.log("info", "Migrated vCard-temp to PEP");
2d8e2de36654 mod_vcard_legacy: Upgrade vcard-temp on login (fixes #1289)
Kim Alvefur <zash@zash.se>
parents: 9813
diff changeset
   349
	else
2d8e2de36654 mod_vcard_legacy: Upgrade vcard-temp on login (fixes #1289)
Kim Alvefur <zash@zash.se>
parents: 9813
diff changeset
   350
		session.log("info", "Failed to migrate vCard-temp to PEP: %s", err or "problem emptying 'vcard' store");
2d8e2de36654 mod_vcard_legacy: Upgrade vcard-temp on login (fixes #1289)
Kim Alvefur <zash@zash.se>
parents: 9813
diff changeset
   351
	end
2d8e2de36654 mod_vcard_legacy: Upgrade vcard-temp on login (fixes #1289)
Kim Alvefur <zash@zash.se>
parents: 9813
diff changeset
   352
end);
9817
071aaaa5cb34 mod_vcard_legacy: Allow disabling vcard conversion
Kim Alvefur <zash@zash.se>
parents: 9816
diff changeset
   353
end