aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/modulemanager.lua1
-rw-r--r--core/stanza_router.lua7
-rw-r--r--plugins/mod_register.lua6
-rw-r--r--plugins/mod_vcard.lua54
-rw-r--r--util/datamanager.lua8
5 files changed, 72 insertions, 4 deletions
diff --git a/core/modulemanager.lua b/core/modulemanager.lua
index 1ad1f990..24708232 100644
--- a/core/modulemanager.lua
+++ b/core/modulemanager.lua
@@ -50,6 +50,7 @@ function loadall()
load("roster");
load("register");
load("tls");
+ load("vcard");
end
function load(name)
diff --git a/core/stanza_router.lua b/core/stanza_router.lua
index 02e0871f..e6085595 100644
--- a/core/stanza_router.lua
+++ b/core/stanza_router.lua
@@ -16,9 +16,12 @@ local jid_split = jid.split;
function core_process_stanza(origin, stanza)
log("debug", "Received: "..tostring(stanza))
-- TODO verify validity of stanza (as well as JID validity)
+ if stanza.name == "iq" and not(#stanza.tags == 1 and stanza.tags[1].attr.xmlns) then
+ error("Invalid IQ");
+ end
if origin.type == "c2s" and not origin.full_jid
- and not(stanza.name == "iq" and stanza.tags[1] and stanza.tags[1].name == "bind"
+ and not(stanza.name == "iq" and stanza.tags[1].name == "bind"
and stanza.tags[1].attr.xmlns == "urn:ietf:params:xml:ns:xmpp-bind") then
error("Client MUST bind resource after auth");
end
@@ -29,6 +32,8 @@ function core_process_stanza(origin, stanza)
if not to or (hosts[to] and hosts[to].type == "local") then
core_handle_stanza(origin, stanza);
+ elseif to and stanza.name == "iq" and not select(3, jid_split(to)) then
+ core_handle_stanza(origin, stanza);
elseif origin.type == "c2s" then
core_route_stanza(origin, stanza);
end
diff --git a/plugins/mod_register.lua b/plugins/mod_register.lua
index b1bf4cc0..ad0ba478 100644
--- a/plugins/mod_register.lua
+++ b/plugins/mod_register.lua
@@ -29,7 +29,8 @@ add_iq_handler("c2s", "jabber:iq:register", function (session, stanza)
if usermanager_create_user(username, password, session.host) then -- password change -- TODO is this the right way?
send(session, st.reply(stanza));
else
- -- TODO internal error, unable to write file, file may be locked, etc
+ -- TODO unable to write file, file may be locked, etc, what's the correct error?
+ send(session, st.error_reply(stanza, "wait", "internal-server-error"));
end
else
send(session, st.error_reply(stanza, "modify", "bad-request"));
@@ -70,7 +71,8 @@ add_iq_handler("c2s_unauthed", "jabber:iq:register", function (session, stanza)
if usermanager_create_user(username, password, session.host) then
send(session, st.reply(stanza)); -- user created!
else
- -- TODO internal error, unable to write file, file may be locked, etc
+ -- TODO unable to write file, file may be locked, etc, what's the correct error?
+ send(session, st.error_reply(stanza, "wait", "internal-server-error"));
end
end
else
diff --git a/plugins/mod_vcard.lua b/plugins/mod_vcard.lua
new file mode 100644
index 00000000..8b76dea7
--- /dev/null
+++ b/plugins/mod_vcard.lua
@@ -0,0 +1,54 @@
+
+require "util.datamanager"
+local datamanager = datamanager;
+
+local st = require "util.stanza"
+local send = require "core.sessionmanager".send_to_session
+local t_concat, t_insert = table.concat, table.insert;
+
+require "util.jid"
+local jid_split = jid.split;
+
+add_iq_handler("c2s", "vcard-temp",
+ function (session, stanza)
+ if stanza.tags[1].name == "vCard" then
+ local to = stanza.attr.to;
+ if stanza.attr.type == "get" then
+ local vCard;
+ if to then
+ local node, host = jid_split(to);
+ if hosts[host] and hosts[host].type == "local" then
+ vCard = datamanager.load(node, host, "vCard"); -- load vCard for user or server
+ end
+ else
+ vCard = datamanager.load(session.username, session.host, "vCard");-- load user's own vCard
+ end
+ if vCard then
+ local iq = st.reply(stanza);
+ iq:add_child(vCard);
+ send(session, iq); -- send vCard!
+ else
+ send(session, st.error_reply(stanza, "cancel", "item-not-found"));
+ end
+ elseif stanza.attr.type == "set" then
+ if not to or to == session.username.."@"..session.host then
+ if datamanager.store(session.username, session.host, "vCard", stanza.tags[1]) then
+ send(session, st.reply(stanza));
+ else
+ -- TODO unable to write file, file may be locked, etc, what's the correct error?
+ send(session, st.error_reply(stanza, "wait", "internal-server-error"));
+ end
+ else
+ send(session, st.error_reply(stanza, "auth", "forbidden"));
+ end
+ end
+ return true;
+ end
+ end);
+
+add_event_hook("stream-features",
+ function (session, features)
+ if session.full_jid then
+ t_insert(features, "<feature var='vcard-temp'/>");
+ end
+ end);
diff --git a/util/datamanager.lua b/util/datamanager.lua
index 71c0fe86..2f5be002 100644
--- a/util/datamanager.lua
+++ b/util/datamanager.lua
@@ -56,7 +56,13 @@ local function simplesave (f, o)
------- API -------------
function getpath(username, host, datastore)
- return format("data/%s/%s/%s.dat", encode(host), datastore, encode(username));
+ if username then
+ return format("data/%s/%s/%s.dat", encode(host), datastore, encode(username));
+ elseif host then
+ return format("data/%s/%s.dat", encode(host), datastore);
+ else
+ return format("data/%s.dat", datastore);
+ end
end
function load(username, host, datastore)