/usr/lib/prosody/modules/storage/xep227store.lib.lua is in prosody 0.9.1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | local st = require "util.stanza";
local function getXml(user, host)
local jid = user.."@"..host;
local path = "data/"..jid..".xml";
local f = io.open(path);
if not f then return; end
local s = f:read("*a");
return parse_xml_real(s);
end
local function setXml(user, host, xml)
local jid = user.."@"..host;
local path = "data/"..jid..".xml";
if xml then
local f = io.open(path, "w");
if not f then return; end
local s = tostring(xml);
f:write(s);
f:close();
return true;
else
return os.remove(path);
end
end
local function getUserElement(xml)
if xml and xml.name == "server-data" then
local host = xml.tags[1];
if host and host.name == "host" then
local user = host.tags[1];
if user and user.name == "user" then
return user;
end
end
end
end
local function createOuterXml(user, host)
return st.stanza("server-data", {xmlns='http://www.xmpp.org/extensions/xep-0227.html#ns'})
:tag("host", {jid=host})
:tag("user", {name = user});
end
local function removeFromArray(array, value)
for i,item in ipairs(array) do
if item == value then
table.remove(array, i);
return;
end
end
end
local function removeStanzaChild(s, child)
removeFromArray(s.tags, child);
removeFromArray(s, child);
end
local handlers = {};
handlers.accounts = {
get = function(self, user)
local user = getUserElement(getXml(user, self.host));
if user and user.attr.password then
return { password = user.attr.password };
end
end;
set = function(self, user, data)
if data and data.password then
local xml = getXml(user, self.host);
if not xml then xml = createOuterXml(user, self.host); end
local usere = getUserElement(xml);
usere.attr.password = data.password;
return setXml(user, self.host, xml);
else
return setXml(user, self.host, nil);
end
end;
};
handlers.vcard = {
get = function(self, user)
local user = getUserElement(getXml(user, self.host));
if user then
local vcard = user:get_child("vCard", 'vcard-temp');
if vcard then
return st.preserialize(vcard);
end
end
end;
set = function(self, user, data)
local xml = getXml(user, self.host);
local usere = xml and getUserElement(xml);
if usere then
local vcard = usere:get_child("vCard", 'vcard-temp');
if vcard then
removeStanzaChild(usere, vcard);
elseif not data then
return true;
end
if data then
vcard = st.deserialize(data);
usere:add_child(vcard);
end
return setXml(user, self.host, xml);
end
return true;
end;
};
handlers.private = {
get = function(self, user)
local user = getUserElement(getXml(user, self.host));
if user then
local private = user:get_child("query", "jabber:iq:private");
if private then
local r = {};
for _, tag in ipairs(private.tags) do
r[tag.name..":"..tag.attr.xmlns] = st.preserialize(tag);
end
return r;
end
end
end;
set = function(self, user, data)
local xml = getXml(user, self.host);
local usere = xml and getUserElement(xml);
if usere then
local private = usere:get_child("query", 'jabber:iq:private');
if private then removeStanzaChild(usere, private); end
if data and next(data) ~= nil then
private = st.stanza("query", {xmlns='jabber:iq:private'});
for _,tag in pairs(data) do
private:add_child(st.deserialize(tag));
end
usere:add_child(private);
end
return setXml(user, self.host, xml);
end
return true;
end;
};
-----------------------------
local driver = {};
driver.__index = driver;
function driver:open(host, datastore, typ)
local cache_key = host.." "..datastore;
if self.ds_cache[cache_key] then return self.ds_cache[cache_key]; end
local instance = setmetatable({}, self);
instance.host = host;
instance.datastore = datastore;
local handler = handlers[datastore];
if not handler then return nil; end
for key,val in pairs(handler) do
instance[key] = val;
end
if instance.init then instance:init(); end
self.ds_cache[cache_key] = instance;
return instance;
end
-----------------------------
local _M = {};
function _M.new()
local instance = setmetatable({}, driver);
instance.__index = instance;
instance.ds_cache = {};
return instance;
end
return _M;
|