Mercurial > prosody-modules
view mod_flags/mod_flags.lua @ 6319:04c3273cb81f
mod_auth_cyrus: Add empty 'profile' table to SASL handler objects
This is for compatibility with Prosody's built-in util.sasl objects.
A SASL profile table usually includes methods supported by the backend, which
can be used by SASL mechanism handlers to perform operations (such as testing
the password). It also optionally contains a 'cb' field with channel binding
method handlers.
The Cyrus backend doesn't support channel binding, and doesn't have the same
concept of auth backend methods (it handles all that internally, and Prosody
has no insight or control over it).
Thus, we create an empty profile which informs Prosody that the SASL handler
does not support any of the auth or channel binding methods. Some features
will not work, but they didn't work anyway. This just makes it explicit.
This fixes a traceback in mod_sasl2_fast, which expected SASL handlers to
always contain a 'profile' field.
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Thu, 04 Sep 2025 10:14:46 +0100 |
| parents | ffec70ddbffc |
| children |
line wrap: on
line source
-- This module is only for 0.12, later versions have mod_flags bundled --% conflicts: mod_flags local flags_map; if prosody.process_type ~= "prosodyctl" then flags_map = module:open_store("account_flags", "map"); end -- API function add_flag(username, flag, comment) -- luacheck: ignore 131/add_flag local flag_data = { when = os.time(); comment = comment; }; local ok, err = flags_map:set(username, flag, flag_data); if not ok then return nil, err; end module:fire_event("user-flag-added/"..flag, { user = username; flag = flag; data = flag_data; }); return true; end function remove_flag(username, flag) -- luacheck: ignore 131/remove_flag local ok, err = flags_map:set(username, flag, nil); if not ok then return nil, err; end module:fire_event("user-flag-removed/"..flag, { user = username; flag = flag; }); return true; end function has_flag(username, flag) -- luacheck: ignore 131/has_flag local ok, err = flags_map:get(username, flag); if not ok and err then error("Failed to check flags for user: "..err); end return not not ok; end function get_flag_info(username, flag) -- luacheck: ignore 131/get_flag_info return flags_map:get(username, flag); end -- Migration from mod_firewall marks local function migrate_marks(host) local usermanager = require "core.usermanager"; local flag_storage = module:open_store("account_flags"); local mark_storage = module:open_store("firewall_marks"); local migration_comment = "Migrated from mod_firewall marks at "..os.date("%Y-%m-%d %R"); local migrated, empty, errors = 0, 0, 0; for username in usermanager.users(host) do local marks, err = mark_storage:get(username); if marks then local flags = {}; for mark_name, mark_timestamp in pairs(marks) do flags[mark_name] = { when = mark_timestamp; comment = migration_comment; }; end local saved_ok, saved_err = flag_storage:set(username, flags); if saved_ok then prosody.log("error", "Failed to save flags for %s: %s", username, saved_err); migrated = migrated + 1; else errors = errors + 1; end elseif err then prosody.log("error", "Failed to load marks for %s: %s", username, err); errors = errors + 1; else empty = empty + 1; end end print(("Finished - %d migrated, %d users with no marks, %d errors"):format(migrated, empty, errors)); end function module.command(arg) local storagemanager = require "core.storagemanager"; local usermanager = require "core.usermanager"; local jid = require "util.jid"; local warn = require"util.prosodyctl".show_warning; local command = arg[1]; if not command then warn("Valid subcommands: migrate_marks"); return 0; end table.remove(arg, 1); local node, host = jid.prepped_split(arg[1]); if not host then warn("Please specify a host or JID after the command"); return 1; elseif not prosody.hosts[host] then warn("Unknown host: "..host); return 1; end table.remove(arg, 1); module.host = host; -- luacheck: ignore 122 storagemanager.initialize_host(host); usermanager.initialize_host(host); flags_map = module:open_store("account_flags", "map"); if command == "migrate_marks" then migrate_marks(host); return 0; elseif command == "find" then local flag = assert(arg[1], "expected argument: flag"); local flags = module:open_store("account_flags", "map"); local users_with_flag = flags:get_all(flag); local c = 0; for user, flag_data in pairs(users_with_flag) do print(user, os.date("%Y-%m-%d %R", flag_data.when), flag_data.comment or ""); c = c + 1; end print(("%d accounts listed"):format(c)); return 1; elseif command == "add" then local username = assert(node, "expected a user JID, got "..host); local flag = assert(arg[1], "expected argument: flag"); local comment = arg[2]; local ok, err = add_flag(username, flag, comment); if not ok then print("Failed to add flag: "..err); return 1; end print("Flag added"); return 1; elseif command == "remove" then local username = assert(node, "expected a user JID, got "..host); local flag = assert(arg[1], "expected argument: flag"); local ok, err = remove_flag(username, flag); if not ok then print("Failed to remove flag: "..err); return 1; end print("Flag removed"); return 1; elseif command == "list" then local username = assert(node, "expected a user JID, got "..host); local c = 0; local flags = module:open_store("account_flags"); local user_flags, err = flags:get(username); if not user_flags and err then print("Unable to list flags: "..err); return 1; end if user_flags then for flag_name, flag_data in pairs(user_flags) do print(flag_name, os.date("%Y-%m-%d %R", flag_data.when), flag_data.comment or ""); c = c + 1; end end print(("%d flags listed"):format(c)); return 0; else warn("Unknown command: %s", command); return 1; end end
