From 8b514a0692d0deb6d1c0b9ddcb94f794c4d25b6e Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Sat, 28 Jul 2012 21:22:42 +0200 Subject: util.datamanager: Add function for listing stores --- util/datamanager.lua | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/util/datamanager.lua b/util/datamanager.lua index 344d2eb1..c29fb416 100644 --- a/util/datamanager.lua +++ b/util/datamanager.lua @@ -226,4 +226,31 @@ function list_load(username, host, datastore) return items; end +function list_stores(username, host) + if not host then + return nil, "bad argument #2 to 'list_stores' (string expected, got nothing)"; + end + local list = {}; + local host_dir = format("%s/%s/", data_path, encode(host)); + for node in lfs.dir(host_dir) do + if not node:match"^%." then -- dots should be encoded, this is probably . or .. + local store = decode(node); + local path = host_dir..node; + if username == true then + if lfs.attributes(path, "mode") == "directory" then + list[#list+1] = store; + end + elseif username then + if lfs.attributes(getpath(username, host, store), "mode") + or lfs.attributes(getpath(username, host, store, "list"), "mode") then + list[#list+1] = store; + end + elseif lfs.attributes(path, "mode") == "file" then + list[#list+1] = store:gsub("%.[dalist]+$",""); + end + end + end + return list; +end + return _M; -- cgit v1.2.3 From f3b4b75347db35923084aa8a113a55287a1f5398 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Sat, 28 Jul 2012 21:24:59 +0200 Subject: mod_storage_internal: Add method for listing stores --- plugins/mod_storage_internal.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/mod_storage_internal.lua b/plugins/mod_storage_internal.lua index 821d1e1a..cd778373 100644 --- a/plugins/mod_storage_internal.lua +++ b/plugins/mod_storage_internal.lua @@ -16,4 +16,8 @@ function driver:set(user, data) return datamanager.store(user, host, self.store, data); end +function driver:list_stores(username) + return datamanager.list_stores(username, host); +end + module:add_item("data-driver", driver); -- cgit v1.2.3 From 780317603fa5d92f7123d26138dfc977b8280590 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Sat, 28 Jul 2012 21:26:33 +0200 Subject: mod_storage_sql: Split out query handling logic from getsql() into a separate function --- plugins/mod_storage_sql.lua | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/mod_storage_sql.lua b/plugins/mod_storage_sql.lua index 6a2d36f1..8b05c822 100644 --- a/plugins/mod_storage_sql.lua +++ b/plugins/mod_storage_sql.lua @@ -175,7 +175,7 @@ local function deserialize(t, value) end end -local function getsql(sql, ...) +local function dosql(sql, ...) if params.driver == "PostgreSQL" then sql = sql:gsub("`", "\""); end @@ -184,12 +184,15 @@ local function getsql(sql, ...) if not stmt and not test_connection() then error("connection failed"); end if not stmt then module:log("error", "QUERY FAILED: %s %s", err, debug.traceback()); return nil, err; end -- run query - local ok, err = stmt:execute(host or "", user or "", store or "", ...); + local ok, err = stmt:execute(...); if not ok and not test_connection() then error("connection failed"); end if not ok then return nil, err; end return stmt; end +local function getsql(sql, ...) + return dosql(sql, host or "", user or "", store or "", ...); +end local function setsql(sql, ...) local stmt, err = getsql(sql, ...); if not stmt then return stmt, err; end -- cgit v1.2.3 From a1c6c07c4426b65e5b40e0b5c903d78ae07e99d4 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Sat, 28 Jul 2012 21:27:45 +0200 Subject: mod_storage_sql: Add method for listing stores --- plugins/mod_storage_sql.lua | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/plugins/mod_storage_sql.lua b/plugins/mod_storage_sql.lua index 8b05c822..211f4d5f 100644 --- a/plugins/mod_storage_sql.lua +++ b/plugins/mod_storage_sql.lua @@ -352,4 +352,22 @@ function driver:open(store, typ) return nil, "unsupported-store"; end +function driver:list_stores(username) -- Not to be confused with the list store type + local sql = (username == true + and "SELECT DISTINCT `store` FROM `prosody` WHERE `host`=? AND `user`!=?" + or "SELECT DISTINCT `store` FROM `prosody` WHERE `host`=? AND `user`=?"); + if username == true or not username then + username = ""; + end + local stmt, err = dosql(sql, host, username); + if not stmt then + return nil, err; + end + local stores = {}; + for row in stmt:rows() do + stores[#stores+1] = row[1]; + end + return stores; +end + module:add_item("data-driver", driver); -- cgit v1.2.3 From 91aea551987526a15ab1b9146738c5b3e9ffe21b Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Sat, 28 Jul 2012 21:30:24 +0200 Subject: storagemanager: Split out driver choosing from the open() method --- core/storagemanager.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/storagemanager.lua b/core/storagemanager.lua index 71e79271..1a5f7d47 100644 --- a/core/storagemanager.lua +++ b/core/storagemanager.lua @@ -58,7 +58,7 @@ function load_driver(host, driver_name) return stores_available:get(host, driver_name); end -function open(host, store, typ) +function get_driver(host, store) local storage = config.get(host, "core", "storage"); local driver_name; local option_type = type(storage); @@ -77,7 +77,11 @@ function open(host, store, typ) driver_name = "null"; driver = null_storage_driver; end + return driver, driver_name; + end +function open(host, store, typ) + local driver, driver_name = get_driver(host, store); local ret, err = driver:open(store, typ); if not ret then if err == "unsupported-store" then -- cgit v1.2.3 From ae1c972cdd64e30c8a5daa5cca9a78bb19a6ba67 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Sat, 28 Jul 2012 21:30:54 +0200 Subject: storagemanager: Add method for listing stores --- core/storagemanager.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/storagemanager.lua b/core/storagemanager.lua index 1a5f7d47..4ae79213 100644 --- a/core/storagemanager.lua +++ b/core/storagemanager.lua @@ -100,5 +100,8 @@ end function datamanager.store(username, host, datastore, data) return open(host, datastore):set(username, data); end +function datamanager.list_stores(username, host) + return get_driver(host):list_stores(username, host); +end return _M; -- cgit v1.2.3 From bf14c1db606376599a6c6c75d234a640ea5519a6 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Sat, 28 Jul 2012 21:31:54 +0200 Subject: util.datamanager: Add function for removing all data belonging to a user --- util/datamanager.lua | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/util/datamanager.lua b/util/datamanager.lua index c29fb416..23a2d74f 100644 --- a/util/datamanager.lua +++ b/util/datamanager.lua @@ -253,4 +253,18 @@ function list_stores(username, host) return list; end +function purge(username, host) + local host_dir = format("%s/%s/", data_path, encode(host)); + local deleted = 0; + for file in lfs.dir(host_dir) do + if lfs.attributes(host_dir..file, "mode") == "directory" then + local store = decode(file); + deleted = deleted + (os_remove(getpath(username, host, store)) and 1 or 0); + deleted = deleted + (os_remove(getpath(username, host, store, "list")) and 1 or 0); + -- We this will generate loads of "No such file or directory", but do we care? + end + end + return deleted > 0, deleted; +end + return _M; -- cgit v1.2.3 From 989d976c85ac5ac50ad68f6fde158aee8fec13d0 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Sat, 28 Jul 2012 21:36:36 +0200 Subject: mod_storage_internal: Add method for removing all data belonging to a user --- plugins/mod_storage_internal.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/mod_storage_internal.lua b/plugins/mod_storage_internal.lua index cd778373..92ac3ef5 100644 --- a/plugins/mod_storage_internal.lua +++ b/plugins/mod_storage_internal.lua @@ -20,4 +20,8 @@ function driver:list_stores(username) return datamanager.list_stores(username, host); end +function driver:purge(user) + return datamanager.purge(user, host); +end + module:add_item("data-driver", driver); -- cgit v1.2.3 From e32e74aaae141499428959e2f6863cea87ee297a Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Sat, 28 Jul 2012 21:36:42 +0200 Subject: mod_storage_sql: Add method for removing all data belonging to a user --- plugins/mod_storage_sql.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugins/mod_storage_sql.lua b/plugins/mod_storage_sql.lua index 211f4d5f..6d19eee6 100644 --- a/plugins/mod_storage_sql.lua +++ b/plugins/mod_storage_sql.lua @@ -370,4 +370,12 @@ function driver:list_stores(username) -- Not to be confused with the list store return stores; end +function driver:purge(username) + local stmt, err = dosql("DELETE FROM `prosody` WHERE `host`=? AND `user`=?", host, username); + if not stmt then return stmt, err; end + local changed, err = stmt:affected(); + if not changed then return changed, err; end + return true, changed; +end + module:add_item("data-driver", driver); -- cgit v1.2.3 From c8d3eca7486cc4e3f707956490dbe4f7fb15eb38 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Sat, 28 Jul 2012 21:38:22 +0200 Subject: storagemanager: Add method for removing all data belonging to a user --- core/storagemanager.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/storagemanager.lua b/core/storagemanager.lua index 4ae79213..3379cc0c 100644 --- a/core/storagemanager.lua +++ b/core/storagemanager.lua @@ -103,5 +103,8 @@ end function datamanager.list_stores(username, host) return get_driver(host):list_stores(username, host); end +function datamanager.purge(username, host) + return get_driver(host):purge(username, host); +end return _M; -- cgit v1.2.3 From a5ad1b5b1739bd8c4393918e73d07ab5854f14b1 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Sat, 28 Jul 2012 21:55:05 +0200 Subject: usermanager: Add method for deleting a user --- core/usermanager.lua | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/core/usermanager.lua b/core/usermanager.lua index 3aba5786..efc15b7c 100644 --- a/core/usermanager.lua +++ b/core/usermanager.lua @@ -10,11 +10,13 @@ local modulemanager = require "core.modulemanager"; local log = require "util.logger".init("usermanager"); local type = type; local ipairs = ipairs; +local pairs = pairs; local jid_bare = require "util.jid".bare; local jid_prep = require "util.jid".prep; local config = require "core.configmanager"; local hosts = hosts; local sasl_new = require "util.sasl".new; +local storagemanager = require "core.storagemanager"; local prosody = _G.prosody; @@ -88,7 +90,15 @@ function create_user(username, password, host) end function delete_user(username, host) - return hosts[host].users.delete_user(username); + local user = hosts[host].sessions[username]; + if user and user.sessions then + for jid, session in pairs(user.sessions) do + session:close{ condition = "not-authorized", text = "Account deleted" }; + end + end + local ok, err = hosts[host].users.delete_user(username); + if not ok then return nil, err; end + return storagemanager.get_driver(host):purge(username); end function get_sasl_handler(host, session) -- cgit v1.2.3