annotate mod_vcard_command/mod_vcard_command.lua @ 4651:8231774f5bfd

mod_cloud_notify_encrypted: Ensure body substring remains valid UTF-8 The `body:sub()` call risks splitting the string in the middle of a multi-byte UTF-8 sequence. This should have been caught by util.stanza validation, but that would have caused some havoc, at the very least causing the notification to not be sent. There have been no reports of this happening. Likely because this module isn't widely deployed among users with languages that use many longer UTF-8 sequences. The util.encodings.utf8.valid() function is O(n) where only the last sequence really needs to be checked, but it's in C and expected to be fast.
author Kim Alvefur <zash@zash.se>
date Sun, 22 Aug 2021 13:22:59 +0200
parents b2c9b832612b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3025
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
1 -----------------------------------------------------------
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
2 -- mod_vcard_command: Manage vcards through prosodyctl
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
3 -- version 0.02
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
4 -----------------------------------------------------------
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
5 -- Copyright (C) 2013 Stefan `Sec` Zehl
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
6 --
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
7 -- This project is MIT/X11 licensed. Please see the
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
8 -- COPYING file in the source package for more information.
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
9 -----------------------------------------------------------
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
10
3026
b2c9b832612b mod_vcard_command: Tweak to not rely on legacy module() behavior
Kim Alvefur <zash@zash.se>
parents: 3025
diff changeset
11 function module.load()
3025
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
12 module:log("error", "Do not load this module in Prosody");
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
13 module.host = "*";
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
14 return;
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
15 end
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
16
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
17
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
18 -- Workaround for lack of util.startup...
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
19 _G.bare_sessions = _G.bare_sessions or {};
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
20
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
21 local storagemanager = require "core.storagemanager";
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
22 local datamanager = require "util.datamanager";
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
23 local xml = require "util.xml";
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
24 local jid = require "util.jid";
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
25 local warn = prosodyctl.show_warning;
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
26 local st = require "util.stanza"
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
27 -- local vcards = module:open_store("vcard");
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
28
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
29 -- Print anything - including nested tables
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
30 function table_print (tt, indent, done)
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
31 done = done or {}
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
32 indent = indent or 0
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
33 if type(tt) == "table" then
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
34 for key, value in pairs (tt) do
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
35 io.write(string.rep (" ", indent)) -- indent it
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
36 if type (value) == "table" and not done [value] then
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
37 done [value] = true
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
38 io.write(string.format("[%s] => table\n", tostring (key)));
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
39 io.write(string.rep (" ", indent+4)) -- indent it
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
40 io.write("(\n");
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
41 table_print (value, indent + 7, done)
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
42 io.write(string.rep (" ", indent+4)) -- indent it
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
43 io.write(")\n");
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
44 else
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
45 io.write(string.format("[%s] => %s\n",
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
46 tostring (key), tostring(value)))
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
47 end
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
48 end
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
49 else
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
50 io.write(tt .. "\n")
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
51 end
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
52 end
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
53
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
54 -- Make a *one-way* subscription. User will see when contact is online,
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
55 -- contact will not see when user is online.
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
56 function vcard_get(user_jid)
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
57 local user_username, user_host = jid.split(user_jid);
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
58 if not hosts[user_host] then
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
59 warn("The host '%s' is not configured for this server.", user_host);
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
60 return;
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
61 end
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
62 storagemanager.initialize_host(user_host);
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
63 local vCard;
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
64 vCard = st.deserialize(datamanager.load(user_username, user_host, "vcard"));
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
65 if vCard then
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
66 print(vCard);
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
67 else
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
68 warn("The user '%s' has no vCard configured.",user_jid);
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
69 end
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
70 end
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
71
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
72 function vcard_set(user_jid, file)
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
73 local user_username, user_host = jid.split(user_jid);
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
74 if not hosts[user_host] then
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
75 warn("The host '%s' is not configured for this server.", user_host);
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
76 return;
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
77 end
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
78 storagemanager.initialize_host(user_host);
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
79 local f = io.input(file);
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
80 local xmldata=io.read("*all");
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
81 io.close(f);
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
82
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
83 local vCard=st.preserialize(xml.parse(xmldata));
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
84
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
85 if vCard then
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
86 datamanager.store(user_username, user_host, "vcard", vCard);
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
87 else
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
88 warn("Could not parse the file.");
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
89 end
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
90 end
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
91
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
92 function vcard_delete(user_jid)
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
93 local user_username, user_host = jid.split(user_jid);
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
94 if not hosts[user_host] then
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
95 warn("The host '%s' is not configured for this server.", user_host);
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
96 return;
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
97 end
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
98 storagemanager.initialize_host(user_host);
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
99 datamanager.store(user_username, user_host, "vcard", nil);
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
100 end
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
101
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
102 function module.command(arg)
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
103 local command = arg[1];
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
104 if not command then
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
105 warn("Valid subcommands: get | set | delete ");
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
106 return 0;
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
107 end
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
108 table.remove(arg, 1);
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
109 if command == "get" then
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
110 vcard_get(arg[1]);
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
111 return 0;
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
112 elseif command == "set" then
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
113 vcard_set(arg[1], arg[2]);
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
114 return 0;
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
115 elseif command == "delete" then
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
116 vcard_delete(arg[1]);
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
117 return 0;
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
118 else
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
119 warn("Unknown command: %s", command);
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
120 return 1;
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
121 end
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
122 return 0;
5b8983e100da mod_vcard_command: a simplistic way to get and set vcard data for registered users
Stefan `Sec` Zehl <sec@42.org>
parents:
diff changeset
123 end