Annotate

core/moduleapi.lua @ 13211:4d4f9e42bcf8

moduleapi: Add :get_option_integer() Many options in Prosody that are treated as numbers don't make sense as floats, e.g. sizes and limits measured in bytes. Simplified implementation based on an earlier attempt dating back to 2020
author Kim Alvefur <zash@zash.se>
date Mon, 17 Jul 2023 00:09:41 +0200
parent 13208:a7c6ea1c5308
child 13212:3e6e98cc63e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 -- Prosody IM
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 -- Copyright (C) 2008-2012 Matthew Wild
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 -- Copyright (C) 2008-2012 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5771
diff changeset
4 --
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 -- COPYING file in the source package for more information.
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 --
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8
12972
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
9 local array = require "prosody.util.array";
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
10 local set = require "prosody.util.set";
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
11 local it = require "prosody.util.iterators";
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
12 local logger = require "prosody.util.logger";
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
13 local timer = require "prosody.util.timer";
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
14 local resolve_relative_path = require"prosody.util.paths".resolve_relative_path;
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
15 local st = require "prosody.util.stanza";
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
16 local cache = require "prosody.util.cache";
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
17 local errors = require "prosody.util.error";
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
18 local promise = require "prosody.util.promise";
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
19 local time_now = require "prosody.util.time".now;
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
20 local format = require "prosody.util.format".format;
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
21 local jid_node = require "prosody.util.jid".node;
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
22 local jid_split = require "prosody.util.jid".split;
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
23 local jid_resource = require "prosody.util.jid".resource;
13204
c9ef35fab0b1 core.moduleapi: Add :get_option_period for parsing time intervals
Kim Alvefur <zash@zash.se>
parents: 13203
diff changeset
24 local human_io = require "prosody.util.human.io";
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 local t_insert, t_remove, t_concat = table.insert, table.remove, table.concat;
5021
85b2689dbcfe Eliminate direct setfenv usage
Florian Zeitz <florob@babelmonkeys.de>
parents: 4896
diff changeset
27 local error, setmetatable, type = error, setmetatable, type;
7162
d0b64f1e4f5d loggingmanager,modulemanager,moduleapi: Localize unpack compatible with Lua 5.2+
Kim Alvefur <zash@zash.se>
parents: 7127
diff changeset
28 local ipairs, pairs, select = ipairs, pairs, select;
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 local tonumber, tostring = tonumber, tostring;
6414
31c15004bfb0 core.moduleapi: Use require instead of global to get storagemanager in module:open_store()
Kim Alvefur <zash@zash.se>
parents: 6165
diff changeset
30 local require = require;
12590
5eaf77114fdb compat: Use table.pack (there since Lua 5.2) over our util.table
Kim Alvefur <zash@zash.se>
parents: 12589
diff changeset
31 local pack = table.pack;
12589
39ae08180c81 compat: Remove handling of Lua 5.1 location of 'unpack' function
Kim Alvefur <zash@zash.se>
parents: 12479
diff changeset
32 local unpack = table.unpack;
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 local prosody = prosody;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 local hosts = prosody.hosts;
5434
9dd36e20c1e3 moduleapi: assert() that prosody.core_post_stanza is not nil
Matthew Wild <mwild1@gmail.com>
parents: 5412
diff changeset
36
9dd36e20c1e3 moduleapi: assert() that prosody.core_post_stanza is not nil
Matthew Wild <mwild1@gmail.com>
parents: 5412
diff changeset
37 -- FIXME: This assert() is to try and catch an obscure bug (2013-04-05)
9dd36e20c1e3 moduleapi: assert() that prosody.core_post_stanza is not nil
Matthew Wild <mwild1@gmail.com>
parents: 5412
diff changeset
38 local core_post_stanza = assert(prosody.core_post_stanza,
9dd36e20c1e3 moduleapi: assert() that prosody.core_post_stanza is not nil
Matthew Wild <mwild1@gmail.com>
parents: 5412
diff changeset
39 "prosody.core_post_stanza is nil, please report this as a bug");
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 -- Registry of shared module data
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 local shared_data = setmetatable({}, { __mode = "v" });
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 local NULL = {};
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 local api = {};
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 -- Returns the name of the current module
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 function api:get_name()
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 return self.name;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 -- Returns the host that the current module is serving
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 function api:get_host()
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 return self.host;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 function api:get_host_type()
5771
c4ed6680bf8d moduleapi: module:get_host_type() now returns 'global' for * and 'local' for non-components
Matthew Wild <mwild1@gmail.com>
parents: 5530
diff changeset
59 return (self.host == "*" and "global") or hosts[self.host].type or "local";
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 function api:set_global()
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 self.host = "*";
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 -- Update the logger
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 local _log = logger.init("mod_"..self.name);
6656
58c111a39d27 moduleapi: Add luacheck annotation
Matthew Wild <mwild1@gmail.com>
parents: 6655
diff changeset
66 self.log = function (self, ...) return _log(...); end; --luacheck: ignore self
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 self._log = _log;
4605
69746db53125 moduleapi: Set module.global = true when module:set_global() is called
Matthew Wild <mwild1@gmail.com>
parents: 4539
diff changeset
68 self.global = true;
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 function api:add_feature(xmlns)
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 self:add_item("feature", xmlns);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 end
6655
a99ed5f5f709 moduleapi: Minor variable renaming to avoid clashes with the 'type' function
Matthew Wild <mwild1@gmail.com>
parents: 6654
diff changeset
74 function api:add_identity(category, identity_type, name)
a99ed5f5f709 moduleapi: Minor variable renaming to avoid clashes with the 'type' function
Matthew Wild <mwild1@gmail.com>
parents: 6654
diff changeset
75 self:add_item("identity", {category = category, type = identity_type, name = name});
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 function api:add_extension(data)
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 self:add_item("extension", data);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 function api:fire_event(...)
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 return (hosts[self.host] or prosody).events.fire_event(...);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84
4534
7a0a31c4f6c5 modulemanager, moduleapi: Replace hooks multitable with an event_handlers map stored in individual modules. Also adds module:hook_object_event() to hook events on any util.events compatible object.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
85 function api:hook_object_event(object, event, handler, priority)
4896
27cda15104f2 modulemanager, moduleapi: Turn module.event_handlers into a multitable and track object->event->handler associations correctly (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 4893
diff changeset
86 self.event_handlers:set(object, event, handler, true);
4534
7a0a31c4f6c5 modulemanager, moduleapi: Replace hooks multitable with an event_handlers map stored in individual modules. Also adds module:hook_object_event() to hook events on any util.events compatible object.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
87 return object.add_handler(event, handler, priority);
7a0a31c4f6c5 modulemanager, moduleapi: Replace hooks multitable with an event_handlers map stored in individual modules. Also adds module:hook_object_event() to hook events on any util.events compatible object.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
88 end
7a0a31c4f6c5 modulemanager, moduleapi: Replace hooks multitable with an event_handlers map stored in individual modules. Also adds module:hook_object_event() to hook events on any util.events compatible object.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
89
4708
0e324923ff95 moduleapi: Fix parameters to unhook_object_event()
Matthew Wild <mwild1@gmail.com>
parents: 4707
diff changeset
90 function api:unhook_object_event(object, event, handler)
6654
22a7ee3379bc moduleapi: Clear self.event_handlers when unhooking an event, to prevent leaks
Matthew Wild <mwild1@gmail.com>
parents: 6653
diff changeset
91 self.event_handlers:set(object, event, handler, nil);
4695
838ad61c6b2c moduleapi: Add module:unhook_object_event()
Matthew Wild <mwild1@gmail.com>
parents: 4666
diff changeset
92 return object.remove_handler(event, handler);
838ad61c6b2c moduleapi: Add module:unhook_object_event()
Matthew Wild <mwild1@gmail.com>
parents: 4666
diff changeset
93 end
838ad61c6b2c moduleapi: Add module:unhook_object_event()
Matthew Wild <mwild1@gmail.com>
parents: 4666
diff changeset
94
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 function api:hook(event, handler, priority)
4534
7a0a31c4f6c5 modulemanager, moduleapi: Replace hooks multitable with an event_handlers map stored in individual modules. Also adds module:hook_object_event() to hook events on any util.events compatible object.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
96 return self:hook_object_event((hosts[self.host] or prosody).events, event, handler, priority);
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99 function api:hook_global(event, handler, priority)
4534
7a0a31c4f6c5 modulemanager, moduleapi: Replace hooks multitable with an event_handlers map stored in individual modules. Also adds module:hook_object_event() to hook events on any util.events compatible object.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
100 return self:hook_object_event(prosody.events, event, handler, priority);
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102
4719
2087d42f1e77 moduleapi: Rename module:hook_stanza() -> module:hook_tag() (hook_stanza works for compat)
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
103 function api:hook_tag(xmlns, name, handler, priority)
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 if not handler and type(name) == "function" then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 -- If only 2 options then they specified no xmlns
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 xmlns, name, handler, priority = nil, xmlns, name, handler;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 elseif not (handler and name) then
11921
89aef37fca54 core.moduleapi: Fix name of renamed API in log message
Kim Alvefur <zash@zash.se>
parents: 11823
diff changeset
108 self:log("warn", "Error: Insufficient parameters to module:hook_tag()");
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109 return;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 end
7947
24170d74b00b core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7646
diff changeset
111 return self:hook("stanza/"..(xmlns and (xmlns..":") or "")..name,
24170d74b00b core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7646
diff changeset
112 function (data) return handler(data.origin, data.stanza, data); end, priority);
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 end
4719
2087d42f1e77 moduleapi: Rename module:hook_stanza() -> module:hook_tag() (hook_stanza works for compat)
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
114 api.hook_stanza = api.hook_tag; -- COMPAT w/pre-0.9
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115
5825
ac5e05ffc921 moduleapi: Add module:unhook()
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
116 function api:unhook(event, handler)
ac5e05ffc921 moduleapi: Add module:unhook()
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
117 return self:unhook_object_event((hosts[self.host] or prosody).events, event, handler);
ac5e05ffc921 moduleapi: Add module:unhook()
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
118 end
ac5e05ffc921 moduleapi: Add module:unhook()
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
119
6640
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
120 function api:wrap_object_event(events_object, event, handler)
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
121 return self:hook_object_event(assert(events_object.wrappers, "no wrappers"), event, handler);
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
122 end
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
123
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
124 function api:wrap_event(event, handler)
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
125 return self:wrap_object_event((hosts[self.host] or prosody).events, event, handler);
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
126 end
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
127
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
128 function api:wrap_global(event, handler)
6652
06116b2789f0 moduleapi: Remove accidental use of undefined and unnecessary 'priority' variable
Matthew Wild <mwild1@gmail.com>
parents: 6651
diff changeset
129 return self:hook_object_event(prosody.events, event, handler);
6640
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
130 end
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
131
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
132 function api:require(lib)
12972
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
133 local modulemanager = require"prosody.core.modulemanager";
12253
57d35fcde488 modulemanager, moduleapi: Switch to new pluginloader interface
Matthew Wild <mwild1@gmail.com>
parents: 12095
diff changeset
134 local f, n = modulemanager.loader:load_code_ext(self.name, lib, "lib.lua", self.environment);
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
135 if not f then error("Failed to load plugin library '"..lib.."', error: "..n); end -- FIXME better error message
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
136 return f();
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
137 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
138
4538
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
139 function api:depends(name)
12972
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
140 local modulemanager = require"prosody.core.modulemanager";
9556
e4c09e335bd9 moduleapi: Prevent loading disabled module as dependency of enabled one
Kim Alvefur <zash@zash.se>
parents: 9509
diff changeset
141 if self:get_option_inherited_set("modules_disabled", {}):contains(name) then
e4c09e335bd9 moduleapi: Prevent loading disabled module as dependency of enabled one
Kim Alvefur <zash@zash.se>
parents: 9509
diff changeset
142 error("Dependency on disabled module mod_"..name);
e4c09e335bd9 moduleapi: Prevent loading disabled module as dependency of enabled one
Kim Alvefur <zash@zash.se>
parents: 9509
diff changeset
143 end
4538
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
144 if not self.dependencies then
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
145 self.dependencies = {};
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
146 self:hook("module-reloaded", function (event)
4854
dab55c6f7710 moduleapi: Don't auto-reload self when already reloading (fixes reload of modules with cyclic dependencies)
Matthew Wild <mwild1@gmail.com>
parents: 4790
diff changeset
147 if self.dependencies[event.module] and not self.reloading then
4538
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
148 self:log("info", "Auto-reloading due to reload of %s:%s", event.host, event.module);
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
149 modulemanager.reload(self.host, self.name);
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
150 return;
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
151 end
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
152 end);
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
153 self:hook("module-unloaded", function (event)
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
154 if self.dependencies[event.module] then
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
155 self:log("info", "Auto-unloading due to unload of %s:%s", event.host, event.module);
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
156 modulemanager.unload(self.host, self.name);
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
157 end
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
158 end);
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
159 end
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
160 local mod = modulemanager.get_module(self.host, name) or modulemanager.get_module("*", name);
4707
d8fc9a1aabeb moduleapi: module:depends(): Don't load shared modules onto the current host if the current host is '*'...
Matthew Wild <mwild1@gmail.com>
parents: 4695
diff changeset
161 if mod and mod.module.host == "*" and self.host ~= "*"
d8fc9a1aabeb moduleapi: module:depends(): Don't load shared modules onto the current host if the current host is '*'...
Matthew Wild <mwild1@gmail.com>
parents: 4695
diff changeset
162 and modulemanager.module_has_method(mod, "add_host") then
5077
6c2c8bf36d22 moduleapi: Clarify comment
Matthew Wild <mwild1@gmail.com>
parents: 5053
diff changeset
163 mod = nil; -- Target is a shared module, so we still want to load it on our host
4663
24524d70a50a moduleapi: module:depends(): Load shared modules onto the current host even if they are loaded globally already
Matthew Wild <mwild1@gmail.com>
parents: 4661
diff changeset
164 end
4538
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
165 if not mod then
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
166 local err;
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
167 mod, err = modulemanager.load(self.host, name);
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
168 if not mod then
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
169 return error(("Unable to load required module, mod_%s: %s"):format(name, ((err or "unknown error"):gsub("%-", " ")) ));
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
170 end
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
171 end
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
172 self.dependencies[name] = true;
12921
d238633a9d67 core.moduleapi: Record reverse dependencies
Kim Alvefur <zash@zash.se>
parents: 12874
diff changeset
173 if not mod.module.reverse_dependencies then
d238633a9d67 core.moduleapi: Record reverse dependencies
Kim Alvefur <zash@zash.se>
parents: 12874
diff changeset
174 mod.module.reverse_dependencies = {};
d238633a9d67 core.moduleapi: Record reverse dependencies
Kim Alvefur <zash@zash.se>
parents: 12874
diff changeset
175 end
d238633a9d67 core.moduleapi: Record reverse dependencies
Kim Alvefur <zash@zash.se>
parents: 12874
diff changeset
176 mod.module.reverse_dependencies[self.name] = true;
4538
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
177 return mod;
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
178 end
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
179
9149
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
180 local function get_shared_table_from_path(module, tables, path)
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
181 if path:sub(1,1) ~= "/" then -- Prepend default components
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
182 local default_path_components = { module.host, module.name };
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
183 local n_components = select(2, path:gsub("/", "%1"));
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
184 path = (n_components<#default_path_components and "/" or "")
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
185 ..t_concat(default_path_components, "/", 1, #default_path_components-n_components).."/"..path;
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
186 end
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
187 local shared = tables[path];
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
188 if not shared then
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
189 shared = {};
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
190 if path:match("%-cache$") then
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
191 setmetatable(shared, { __mode = "kv" });
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
192 end
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
193 tables[path] = shared;
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
194 end
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
195 return shared;
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
196 end
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
197
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
198 -- Returns a shared table at the specified virtual path
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
199 -- Intentionally does not allow the table to be _set_, it
4539
3cbfa768eb06 moduleapi: Add module:shared(), a way to easily share data between multiple loaded modules
Matthew Wild <mwild1@gmail.com>
parents: 4538
diff changeset
200 -- is auto-created if it does not exist.
9149
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
201 function api:shared(path)
4651
d1739d72100a moduleapi: Have modules internally store a reference to shared tables they use, to ensure they don't get collected while any module that had access to that table is still loaded (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 4614
diff changeset
202 if not self.shared_data then self.shared_data = {}; end
9149
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
203 local shared = get_shared_table_from_path(self, shared_data, path);
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
204 self.shared_data[path] = shared;
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
205 return shared;
4539
3cbfa768eb06 moduleapi: Add module:shared(), a way to easily share data between multiple loaded modules
Matthew Wild <mwild1@gmail.com>
parents: 4538
diff changeset
206 end
3cbfa768eb06 moduleapi: Add module:shared(), a way to easily share data between multiple loaded modules
Matthew Wild <mwild1@gmail.com>
parents: 4538
diff changeset
207
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
208 function api:get_option(name, default_value)
12972
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
209 local config = require "prosody.core.configmanager";
5377
898454038524 core.*: Complete removal of all traces of the "core" section and section-related code.
Kim Alvefur <zash@zash.se>
parents: 5163
diff changeset
210 local value = config.get(self.host, name);
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
211 if value == nil then
5377
898454038524 core.*: Complete removal of all traces of the "core" section and section-related code.
Kim Alvefur <zash@zash.se>
parents: 5163
diff changeset
212 value = default_value;
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
213 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
214 return value;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
215 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
216
7975
c64ddee9d671 core.moduleapi: Factor out code for getting a scalar config option
Kim Alvefur <zash@zash.se>
parents: 7947
diff changeset
217 function api:get_option_scalar(name, default_value)
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
218 local value = self:get_option(name, default_value);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
219 if type(value) == "table" then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
220 if #value > 1 then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
221 self:log("error", "Config option '%s' does not take a list, using just the first item", name);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
222 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
223 value = value[1];
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
224 end
7975
c64ddee9d671 core.moduleapi: Factor out code for getting a scalar config option
Kim Alvefur <zash@zash.se>
parents: 7947
diff changeset
225 return value;
c64ddee9d671 core.moduleapi: Factor out code for getting a scalar config option
Kim Alvefur <zash@zash.se>
parents: 7947
diff changeset
226 end
c64ddee9d671 core.moduleapi: Factor out code for getting a scalar config option
Kim Alvefur <zash@zash.se>
parents: 7947
diff changeset
227
c64ddee9d671 core.moduleapi: Factor out code for getting a scalar config option
Kim Alvefur <zash@zash.se>
parents: 7947
diff changeset
228 function api:get_option_string(name, default_value)
c64ddee9d671 core.moduleapi: Factor out code for getting a scalar config option
Kim Alvefur <zash@zash.se>
parents: 7947
diff changeset
229 local value = self:get_option_scalar(name, default_value);
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
230 if value == nil then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
231 return nil;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
232 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
233 return tostring(value);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
234 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
235
13203
aa6c2692a4be core.moduleapi: Allow specifying an acceptable range for number options
Kim Alvefur <zash@zash.se>
parents: 13201
diff changeset
236 function api:get_option_number(name, default_value, min, max)
aa6c2692a4be core.moduleapi: Allow specifying an acceptable range for number options
Kim Alvefur <zash@zash.se>
parents: 13201
diff changeset
237 local value = self:get_option_scalar(name, default_value);
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
238 local ret = tonumber(value);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
239 if value ~= nil and ret == nil then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
240 self:log("error", "Config option '%s' not understood, expecting a number", name);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
241 end
13203
aa6c2692a4be core.moduleapi: Allow specifying an acceptable range for number options
Kim Alvefur <zash@zash.se>
parents: 13201
diff changeset
242 if ret == default_value then
aa6c2692a4be core.moduleapi: Allow specifying an acceptable range for number options
Kim Alvefur <zash@zash.se>
parents: 13201
diff changeset
243 -- skip interval checks for default or nil
aa6c2692a4be core.moduleapi: Allow specifying an acceptable range for number options
Kim Alvefur <zash@zash.se>
parents: 13201
diff changeset
244 return ret;
aa6c2692a4be core.moduleapi: Allow specifying an acceptable range for number options
Kim Alvefur <zash@zash.se>
parents: 13201
diff changeset
245 end
aa6c2692a4be core.moduleapi: Allow specifying an acceptable range for number options
Kim Alvefur <zash@zash.se>
parents: 13201
diff changeset
246 if min and ret < min then
aa6c2692a4be core.moduleapi: Allow specifying an acceptable range for number options
Kim Alvefur <zash@zash.se>
parents: 13201
diff changeset
247 self:log("warn", "Config option '%s' out of bounds %g < %g", name, ret, min);
aa6c2692a4be core.moduleapi: Allow specifying an acceptable range for number options
Kim Alvefur <zash@zash.se>
parents: 13201
diff changeset
248 return min;
aa6c2692a4be core.moduleapi: Allow specifying an acceptable range for number options
Kim Alvefur <zash@zash.se>
parents: 13201
diff changeset
249 end
aa6c2692a4be core.moduleapi: Allow specifying an acceptable range for number options
Kim Alvefur <zash@zash.se>
parents: 13201
diff changeset
250 if max and ret > max then
aa6c2692a4be core.moduleapi: Allow specifying an acceptable range for number options
Kim Alvefur <zash@zash.se>
parents: 13201
diff changeset
251 self:log("warn", "Config option '%s' out of bounds %g > %g", name, ret, max);
aa6c2692a4be core.moduleapi: Allow specifying an acceptable range for number options
Kim Alvefur <zash@zash.se>
parents: 13201
diff changeset
252 return max;
aa6c2692a4be core.moduleapi: Allow specifying an acceptable range for number options
Kim Alvefur <zash@zash.se>
parents: 13201
diff changeset
253 end
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
254 return ret;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
255 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
256
13211
4d4f9e42bcf8 moduleapi: Add :get_option_integer()
Kim Alvefur <zash@zash.se>
parents: 13208
diff changeset
257 function api:get_option_integer(name, default_value, min, max)
4d4f9e42bcf8 moduleapi: Add :get_option_integer()
Kim Alvefur <zash@zash.se>
parents: 13208
diff changeset
258 local value = self:get_option_number(name, default_value, min or math.mininteger or 2 ^ 53, max or math.maxinteger or -2 ^ 52);
4d4f9e42bcf8 moduleapi: Add :get_option_integer()
Kim Alvefur <zash@zash.se>
parents: 13208
diff changeset
259 if value == default_value then
4d4f9e42bcf8 moduleapi: Add :get_option_integer()
Kim Alvefur <zash@zash.se>
parents: 13208
diff changeset
260 -- pass default trough unaltered, violates ranges sometimes
4d4f9e42bcf8 moduleapi: Add :get_option_integer()
Kim Alvefur <zash@zash.se>
parents: 13208
diff changeset
261 return value;
4d4f9e42bcf8 moduleapi: Add :get_option_integer()
Kim Alvefur <zash@zash.se>
parents: 13208
diff changeset
262 end
4d4f9e42bcf8 moduleapi: Add :get_option_integer()
Kim Alvefur <zash@zash.se>
parents: 13208
diff changeset
263 if math.type(value) == "float" then
4d4f9e42bcf8 moduleapi: Add :get_option_integer()
Kim Alvefur <zash@zash.se>
parents: 13208
diff changeset
264 self:log("warn", "Config option '%s' expected an integer, not a float (%g)", name, value)
4d4f9e42bcf8 moduleapi: Add :get_option_integer()
Kim Alvefur <zash@zash.se>
parents: 13208
diff changeset
265 return math.floor(value);
4d4f9e42bcf8 moduleapi: Add :get_option_integer()
Kim Alvefur <zash@zash.se>
parents: 13208
diff changeset
266 end
4d4f9e42bcf8 moduleapi: Add :get_option_integer()
Kim Alvefur <zash@zash.se>
parents: 13208
diff changeset
267 -- nil or an integer
4d4f9e42bcf8 moduleapi: Add :get_option_integer()
Kim Alvefur <zash@zash.se>
parents: 13208
diff changeset
268 return value;
4d4f9e42bcf8 moduleapi: Add :get_option_integer()
Kim Alvefur <zash@zash.se>
parents: 13208
diff changeset
269 end
4d4f9e42bcf8 moduleapi: Add :get_option_integer()
Kim Alvefur <zash@zash.se>
parents: 13208
diff changeset
270
13204
c9ef35fab0b1 core.moduleapi: Add :get_option_period for parsing time intervals
Kim Alvefur <zash@zash.se>
parents: 13203
diff changeset
271 function api:get_option_period(name, default_value)
c9ef35fab0b1 core.moduleapi: Add :get_option_period for parsing time intervals
Kim Alvefur <zash@zash.se>
parents: 13203
diff changeset
272 local value = self:get_option_scalar(name, default_value);
13205
0ccd82b965d5 core.moduleapi: Improve handling of different types in :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13204
diff changeset
273 if type(value) == "number" then
13206
7435a9341bb3 core.moduleapi: Turn negative periods or "never" into infinity
Kim Alvefur <zash@zash.se>
parents: 13205
diff changeset
274 if value < 0 then
7435a9341bb3 core.moduleapi: Turn negative periods or "never" into infinity
Kim Alvefur <zash@zash.se>
parents: 13205
diff changeset
275 self:log("debug", "Treating negative period as infinity");
7435a9341bb3 core.moduleapi: Turn negative periods or "never" into infinity
Kim Alvefur <zash@zash.se>
parents: 13205
diff changeset
276 return math.huge;
7435a9341bb3 core.moduleapi: Turn negative periods or "never" into infinity
Kim Alvefur <zash@zash.se>
parents: 13205
diff changeset
277 end
13204
c9ef35fab0b1 core.moduleapi: Add :get_option_period for parsing time intervals
Kim Alvefur <zash@zash.se>
parents: 13203
diff changeset
278 -- assume seconds
13205
0ccd82b965d5 core.moduleapi: Improve handling of different types in :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13204
diff changeset
279 return value;
13208
a7c6ea1c5308 core.moduleapi: Accept boolean false to disable period setting
Kim Alvefur <zash@zash.se>
parents: 13207
diff changeset
280 elseif value == "never" or value == false then
13206
7435a9341bb3 core.moduleapi: Turn negative periods or "never" into infinity
Kim Alvefur <zash@zash.se>
parents: 13205
diff changeset
281 -- usually for disabling some periodic thing
7435a9341bb3 core.moduleapi: Turn negative periods or "never" into infinity
Kim Alvefur <zash@zash.se>
parents: 13205
diff changeset
282 return math.huge;
13205
0ccd82b965d5 core.moduleapi: Improve handling of different types in :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13204
diff changeset
283 elseif type(value) == "string" then
0ccd82b965d5 core.moduleapi: Improve handling of different types in :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13204
diff changeset
284 local ret = human_io.parse_duration(value);
0ccd82b965d5 core.moduleapi: Improve handling of different types in :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13204
diff changeset
285 if value ~= nil and ret == nil then
0ccd82b965d5 core.moduleapi: Improve handling of different types in :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13204
diff changeset
286 self:log("error", "Config option '%s' not understood, expecting a period (e.g. \"2 days\")", name);
0ccd82b965d5 core.moduleapi: Improve handling of different types in :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13204
diff changeset
287 end
0ccd82b965d5 core.moduleapi: Improve handling of different types in :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13204
diff changeset
288 return ret;
13207
c563da1694bf core.moduleapi: Log error for unexpected types (booleans?) set as periods
Kim Alvefur <zash@zash.se>
parents: 13206
diff changeset
289 elseif value ~= nil then
c563da1694bf core.moduleapi: Log error for unexpected types (booleans?) set as periods
Kim Alvefur <zash@zash.se>
parents: 13206
diff changeset
290 self:log("error", "Config option '%s' expects a number or a period description string (e.g. \"3 hours\"), not %s", name, type(value));
13204
c9ef35fab0b1 core.moduleapi: Add :get_option_period for parsing time intervals
Kim Alvefur <zash@zash.se>
parents: 13203
diff changeset
291 end
c9ef35fab0b1 core.moduleapi: Add :get_option_period for parsing time intervals
Kim Alvefur <zash@zash.se>
parents: 13203
diff changeset
292 end
c9ef35fab0b1 core.moduleapi: Add :get_option_period for parsing time intervals
Kim Alvefur <zash@zash.se>
parents: 13203
diff changeset
293
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
294 function api:get_option_boolean(name, ...)
7975
c64ddee9d671 core.moduleapi: Factor out code for getting a scalar config option
Kim Alvefur <zash@zash.se>
parents: 7947
diff changeset
295 local value = self:get_option_scalar(name, ...);
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
296 if value == nil then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
297 return nil;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
298 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
299 local ret = value == true or value == "true" or value == 1 or nil;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
300 if ret == nil then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
301 ret = (value == false or value == "false" or value == 0);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
302 if ret then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
303 ret = false;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
304 else
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
305 ret = nil;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
306 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
307 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
308 if ret == nil then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
309 self:log("error", "Config option '%s' not understood, expecting true/false", name);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
310 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
311 return ret;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
312 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
313
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
314 function api:get_option_array(name, ...)
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
315 local value = self:get_option(name, ...);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
316
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
317 if value == nil then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
318 return nil;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
319 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5771
diff changeset
320
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
321 if type(value) ~= "table" then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
322 return array{ value }; -- Assume any non-list is a single-item list
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
323 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5771
diff changeset
324
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
325 return array():append(value); -- Clone
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
326 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
327
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
328 function api:get_option_set(name, ...)
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
329 local value = self:get_option_array(name, ...);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5771
diff changeset
330
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
331 if value == nil then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
332 return nil;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
333 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5771
diff changeset
334
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
335 return set.new(value);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
336 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
337
5527
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
338 function api:get_option_inherited_set(name, ...)
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
339 local value = self:get_option_set(name, ...);
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
340 local global_value = self:context("*"):get_option_set(name, ...);
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
341 if not value then
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
342 return global_value;
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
343 elseif not global_value then
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
344 return value;
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
345 end
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
346 value:include(global_value);
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
347 return value;
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
348 end
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
349
7127
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
350 function api:get_option_path(name, default, parent)
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
351 if parent == nil then
9509
b57353f76c83 core.moduleapi: Remove redundant condition
Kim Alvefur <zash@zash.se>
parents: 9149
diff changeset
352 parent = self:get_directory();
7127
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
353 elseif prosody.paths[parent] then
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
354 parent = prosody.paths[parent];
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
355 end
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
356 local value = self:get_option_string(name, default);
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
357 if value == nil then
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
358 return nil;
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
359 end
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
360 return resolve_relative_path(parent, value);
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
361 end
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
362
13201
65fb0d7a2312 moduleapi: Add enum config option method
Kim Alvefur <zash@zash.se>
parents: 13016
diff changeset
363 function api:get_option_enum(name, default, ...)
65fb0d7a2312 moduleapi: Add enum config option method
Kim Alvefur <zash@zash.se>
parents: 13016
diff changeset
364 local value = self:get_option_scalar(name, default);
65fb0d7a2312 moduleapi: Add enum config option method
Kim Alvefur <zash@zash.se>
parents: 13016
diff changeset
365 if value == nil then return nil; end
65fb0d7a2312 moduleapi: Add enum config option method
Kim Alvefur <zash@zash.se>
parents: 13016
diff changeset
366 local options = set.new{default, ...};
65fb0d7a2312 moduleapi: Add enum config option method
Kim Alvefur <zash@zash.se>
parents: 13016
diff changeset
367 if not options:contains(value) then
65fb0d7a2312 moduleapi: Add enum config option method
Kim Alvefur <zash@zash.se>
parents: 13016
diff changeset
368 self:log("error", "Config option '%s' not in set of allowed values (one of: %s)", name, options);
65fb0d7a2312 moduleapi: Add enum config option method
Kim Alvefur <zash@zash.se>
parents: 13016
diff changeset
369 end
65fb0d7a2312 moduleapi: Add enum config option method
Kim Alvefur <zash@zash.se>
parents: 13016
diff changeset
370 return value;
65fb0d7a2312 moduleapi: Add enum config option method
Kim Alvefur <zash@zash.se>
parents: 13016
diff changeset
371 end
7127
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
372
5526
d54011a23b20 moduleapi: Add module:context(host) to produce a fake API context for a given host (or global). module:context("*"):get_option("foo") to get global options.
Matthew Wild <mwild1@gmail.com>
parents: 5498
diff changeset
373 function api:context(host)
12479
4d36fbcdd210 core.moduleapi: Fix 'global' property via :context() - #1748
Kim Alvefur <zash@zash.se>
parents: 12253
diff changeset
374 return setmetatable({ host = host or "*", global = "*" == host }, { __index = self, __newindex = self });
5526
d54011a23b20 moduleapi: Add module:context(host) to produce a fake API context for a given host (or global). module:context("*"):get_option("foo") to get global options.
Matthew Wild <mwild1@gmail.com>
parents: 5498
diff changeset
375 end
d54011a23b20 moduleapi: Add module:context(host) to produce a fake API context for a given host (or global). module:context("*"):get_option("foo") to get global options.
Matthew Wild <mwild1@gmail.com>
parents: 5498
diff changeset
376
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
377 function api:add_item(key, value)
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
378 self.items = self.items or {};
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
379 self.items[key] = self.items[key] or {};
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
380 t_insert(self.items[key], value);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
381 self:fire_event("item-added/"..key, {source = self, item = value});
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
382 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
383 function api:remove_item(key, value)
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
384 local t = self.items and self.items[key] or NULL;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
385 for i = #t,1,-1 do
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
386 if t[i] == value then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
387 t_remove(self.items[key], i);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
388 self:fire_event("item-removed/"..key, {source = self, item = value});
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
389 return value;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
390 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
391 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
392 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
393
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
394 function api:get_host_items(key)
12972
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
395 local modulemanager = require"prosody.core.modulemanager";
5412
a5fcda77c6b1 moduleapi: have get_host_items wrap on get_items from modulemanager, also add has_{feature/identity} to the API.
Marco Cirillo <maranda@lightwitch.org>
parents: 5377
diff changeset
396 local result = modulemanager.get_items(key, self.host) or {};
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
397 return result;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
398 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
399
6655
a99ed5f5f709 moduleapi: Minor variable renaming to avoid clashes with the 'type' function
Matthew Wild <mwild1@gmail.com>
parents: 6654
diff changeset
400 function api:handle_items(item_type, added_cb, removed_cb, existing)
a99ed5f5f709 moduleapi: Minor variable renaming to avoid clashes with the 'type' function
Matthew Wild <mwild1@gmail.com>
parents: 6654
diff changeset
401 self:hook("item-added/"..item_type, added_cb);
a99ed5f5f709 moduleapi: Minor variable renaming to avoid clashes with the 'type' function
Matthew Wild <mwild1@gmail.com>
parents: 6654
diff changeset
402 self:hook("item-removed/"..item_type, removed_cb);
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
403 if existing ~= false then
6655
a99ed5f5f709 moduleapi: Minor variable renaming to avoid clashes with the 'type' function
Matthew Wild <mwild1@gmail.com>
parents: 6654
diff changeset
404 for _, item in ipairs(self:get_host_items(item_type)) do
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
405 added_cb({ item = item });
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
406 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
407 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
408 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
409
4613
27fbc9c69eb5 moduleapi: Add module:provides(), a shortcut to add an item with the current module's name
Matthew Wild <mwild1@gmail.com>
parents: 4605
diff changeset
410 function api:provides(name, item)
5529
af58eea131b4 moduleapi: module:provides called without an item makes a copy of the environment instead. Fixes warnings about non-existent globals
Kim Alvefur <zash@zash.se>
parents: 5527
diff changeset
411 -- if not item then item = setmetatable({}, { __index = function(t,k) return rawget(self.environment, k); end }); end
af58eea131b4 moduleapi: module:provides called without an item makes a copy of the environment instead. Fixes warnings about non-existent globals
Kim Alvefur <zash@zash.se>
parents: 5527
diff changeset
412 if not item then
af58eea131b4 moduleapi: module:provides called without an item makes a copy of the environment instead. Fixes warnings about non-existent globals
Kim Alvefur <zash@zash.se>
parents: 5527
diff changeset
413 item = {}
af58eea131b4 moduleapi: module:provides called without an item makes a copy of the environment instead. Fixes warnings about non-existent globals
Kim Alvefur <zash@zash.se>
parents: 5527
diff changeset
414 for k,v in pairs(self.environment) do
af58eea131b4 moduleapi: module:provides called without an item makes a copy of the environment instead. Fixes warnings about non-existent globals
Kim Alvefur <zash@zash.se>
parents: 5527
diff changeset
415 if k ~= "module" then item[k] = v; end
af58eea131b4 moduleapi: module:provides called without an item makes a copy of the environment instead. Fixes warnings about non-existent globals
Kim Alvefur <zash@zash.se>
parents: 5527
diff changeset
416 end
af58eea131b4 moduleapi: module:provides called without an item makes a copy of the environment instead. Fixes warnings about non-existent globals
Kim Alvefur <zash@zash.se>
parents: 5527
diff changeset
417 end
4613
27fbc9c69eb5 moduleapi: Add module:provides(), a shortcut to add an item with the current module's name
Matthew Wild <mwild1@gmail.com>
parents: 4605
diff changeset
418 if not item.name then
4660
96b40b5e8ea8 moduleapi: module:provides(): Fix usage of wrong table
Matthew Wild <mwild1@gmail.com>
parents: 4651
diff changeset
419 local item_name = self.name;
4613
27fbc9c69eb5 moduleapi: Add module:provides(), a shortcut to add an item with the current module's name
Matthew Wild <mwild1@gmail.com>
parents: 4605
diff changeset
420 -- Strip a provider prefix to find the item name
27fbc9c69eb5 moduleapi: Add module:provides(), a shortcut to add an item with the current module's name
Matthew Wild <mwild1@gmail.com>
parents: 4605
diff changeset
421 -- (e.g. "auth_foo" -> "foo" for an auth provider)
12095
c1d2bc6603ae moduleapi: Support stripping of multi-word from module names
Matthew Wild <mwild1@gmail.com>
parents: 12002
diff changeset
422 if item_name:find((name:gsub("%-", "_")).."_", 1, true) == 1 then
4613
27fbc9c69eb5 moduleapi: Add module:provides(), a shortcut to add an item with the current module's name
Matthew Wild <mwild1@gmail.com>
parents: 4605
diff changeset
423 item_name = item_name:sub(#name+2);
27fbc9c69eb5 moduleapi: Add module:provides(), a shortcut to add an item with the current module's name
Matthew Wild <mwild1@gmail.com>
parents: 4605
diff changeset
424 end
27fbc9c69eb5 moduleapi: Add module:provides(), a shortcut to add an item with the current module's name
Matthew Wild <mwild1@gmail.com>
parents: 4605
diff changeset
425 item.name = item_name;
27fbc9c69eb5 moduleapi: Add module:provides(), a shortcut to add an item with the current module's name
Matthew Wild <mwild1@gmail.com>
parents: 4605
diff changeset
426 end
5530
d83482fc4a81 moduleapi: in module:provides(), add the name of the module in item._provided_by
Kim Alvefur <zash@zash.se>
parents: 5529
diff changeset
427 item._provided_by = self.name;
4661
76db5d0a2104 moduleapi: module:provides(): Add "-provider" onto the key name
Matthew Wild <mwild1@gmail.com>
parents: 4660
diff changeset
428 self:add_item(name.."-provider", item);
4613
27fbc9c69eb5 moduleapi: Add module:provides(), a shortcut to add an item with the current module's name
Matthew Wild <mwild1@gmail.com>
parents: 4605
diff changeset
429 end
27fbc9c69eb5 moduleapi: Add module:provides(), a shortcut to add an item with the current module's name
Matthew Wild <mwild1@gmail.com>
parents: 4605
diff changeset
430
7342
79a5db780e8b moduleapi: Allow an origin session to be passed to module:send()
Kim Alvefur <zash@zash.se>
parents: 7163
diff changeset
431 function api:send(stanza, origin)
79a5db780e8b moduleapi: Allow an origin session to be passed to module:send()
Kim Alvefur <zash@zash.se>
parents: 7163
diff changeset
432 return core_post_stanza(origin or hosts[self.host], stanza);
4614
20940729c1b4 moduleapi: Add module:send() as an alias for core_post_stanza() from the current host's origin
Matthew Wild <mwild1@gmail.com>
parents: 4613
diff changeset
433 end
20940729c1b4 moduleapi: Add module:send() as an alias for core_post_stanza() from the current host's origin
Matthew Wild <mwild1@gmail.com>
parents: 4613
diff changeset
434
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
435 function api:send_iq(stanza, origin, timeout)
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
436 local iq_cache = self._iq_cache;
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
437 if not iq_cache then
9747
c8240f931a68 core.moduleapi: Move util imports to top
Kim Alvefur <zash@zash.se>
parents: 9733
diff changeset
438 iq_cache = cache.new(256, function (_, iq)
10576
f88f1151bc72 core.moduleapi: Rename local name for util.error for consistency
Kim Alvefur <zash@zash.se>
parents: 10575
diff changeset
439 iq.reject(errors.new({
9748
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
440 type = "wait", condition = "resource-constraint",
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
441 text = "evicted from iq tracking cache"
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
442 }));
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
443 end);
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
444 self._iq_cache = iq_cache;
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
445 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
446
10214
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
447 local event_type;
10595
17bab303daf5 core.moduleapi: Hook correct event type in some cases
Kim Alvefur <zash@zash.se>
parents: 10576
diff changeset
448 if not jid_node(stanza.attr.from) then
10214
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
449 event_type = "host";
11822
bdabb0425d77 core.moduleapi: Enable full JID origin queries with module:send_iq()
Kim Alvefur <zash@zash.se>
parents: 11821
diff changeset
450 elseif jid_resource(stanza.attr.from) then
bdabb0425d77 core.moduleapi: Enable full JID origin queries with module:send_iq()
Kim Alvefur <zash@zash.se>
parents: 11821
diff changeset
451 event_type = "full";
10214
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
452 else -- assume bare since we can't hook full jids
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
453 event_type = "bare";
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
454 end
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
455 local result_event = "iq-result/"..event_type.."/"..stanza.attr.id;
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
456 local error_event = "iq-error/"..event_type.."/"..stanza.attr.id;
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
457 local cache_key = event_type.."/"..stanza.attr.id;
11822
bdabb0425d77 core.moduleapi: Enable full JID origin queries with module:send_iq()
Kim Alvefur <zash@zash.se>
parents: 11821
diff changeset
458 if event_type == "full" then
bdabb0425d77 core.moduleapi: Enable full JID origin queries with module:send_iq()
Kim Alvefur <zash@zash.se>
parents: 11821
diff changeset
459 result_event = "iq/" .. event_type;
bdabb0425d77 core.moduleapi: Enable full JID origin queries with module:send_iq()
Kim Alvefur <zash@zash.se>
parents: 11821
diff changeset
460 error_event = "iq/" .. event_type;
bdabb0425d77 core.moduleapi: Enable full JID origin queries with module:send_iq()
Kim Alvefur <zash@zash.se>
parents: 11821
diff changeset
461 end
10214
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
462
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
463 local p = promise.new(function (resolve, reject)
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
464 local function result_handler(event)
11822
bdabb0425d77 core.moduleapi: Enable full JID origin queries with module:send_iq()
Kim Alvefur <zash@zash.se>
parents: 11821
diff changeset
465 local response = event.stanza;
bdabb0425d77 core.moduleapi: Enable full JID origin queries with module:send_iq()
Kim Alvefur <zash@zash.se>
parents: 11821
diff changeset
466 if response.attr.type == "result" and response.attr.from == stanza.attr.to and response.attr.id == stanza.attr.id then
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
467 resolve(event);
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
468 return true;
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
469 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
470 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
471
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
472 local function error_handler(event)
11822
bdabb0425d77 core.moduleapi: Enable full JID origin queries with module:send_iq()
Kim Alvefur <zash@zash.se>
parents: 11821
diff changeset
473 local response = event.stanza;
bdabb0425d77 core.moduleapi: Enable full JID origin queries with module:send_iq()
Kim Alvefur <zash@zash.se>
parents: 11821
diff changeset
474 if response.attr.type == "error" and response.attr.from == stanza.attr.to and response.attr.id == stanza.attr.id then
10576
f88f1151bc72 core.moduleapi: Rename local name for util.error for consistency
Kim Alvefur <zash@zash.se>
parents: 10575
diff changeset
475 reject(errors.from_stanza(event.stanza, event));
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
476 return true;
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
477 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
478 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
479
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
480 if iq_cache:get(cache_key) then
10576
f88f1151bc72 core.moduleapi: Rename local name for util.error for consistency
Kim Alvefur <zash@zash.se>
parents: 10575
diff changeset
481 reject(errors.new({
9748
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
482 type = "modify", condition = "conflict",
10213
ee62754b0233 core.moduleapi: Uppercase "IQ stanza" for consistency
Kim Alvefur <zash@zash.se>
parents: 9930
diff changeset
483 text = "IQ stanza id attribute already used",
9748
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
484 }));
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
485 return;
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
486 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
487
11823
36a7a3137d41 core.moduleapi: Ensure module:send_iq() handler priority over mod_iq
Kim Alvefur <zash@zash.se>
parents: 11822
diff changeset
488 self:hook(result_event, result_handler, 1);
36a7a3137d41 core.moduleapi: Ensure module:send_iq() handler priority over mod_iq
Kim Alvefur <zash@zash.se>
parents: 11822
diff changeset
489 self:hook(error_event, error_handler, 1);
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
490
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
491 local timeout_handle = self:add_timer(timeout or 120, function ()
10576
f88f1151bc72 core.moduleapi: Rename local name for util.error for consistency
Kim Alvefur <zash@zash.se>
parents: 10575
diff changeset
492 reject(errors.new({
9748
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
493 type = "wait", condition = "remote-server-timeout",
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
494 text = "IQ stanza timed out",
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
495 }));
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
496 end);
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
497
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
498 local ok = iq_cache:set(cache_key, {
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
499 reject = reject, resolve = resolve,
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
500 timeout_handle = timeout_handle,
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
501 result_handler = result_handler, error_handler = error_handler;
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
502 });
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
503
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
504 if not ok then
10576
f88f1151bc72 core.moduleapi: Rename local name for util.error for consistency
Kim Alvefur <zash@zash.se>
parents: 10575
diff changeset
505 reject(errors.new({
9748
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
506 type = "wait", condition = "internal-server-error",
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
507 text = "Could not store IQ tracking data"
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
508 }));
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
509 return;
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
510 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
511
10705
2cffb5ce9f7a moduleapi: Fix handling of replies to :send_iq from internal modules
Kim Alvefur <zash@zash.se>
parents: 10595
diff changeset
512 local wrapped_origin = setmetatable({
2cffb5ce9f7a moduleapi: Fix handling of replies to :send_iq from internal modules
Kim Alvefur <zash@zash.se>
parents: 10595
diff changeset
513 -- XXX Needed in some cases for replies to work correctly when sending queries internally.
10706
0230ceecb8a9 moduleapi: Rename argument to silence luacheck
Kim Alvefur <zash@zash.se>
parents: 10705
diff changeset
514 send = function (reply)
11821
a9ad287c3388 core.moduleapi: Filter out unrelated direct replies to module:send_iq
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
515 if reply.name == stanza.name and reply.attr.id == stanza.attr.id then
a9ad287c3388 core.moduleapi: Filter out unrelated direct replies to module:send_iq
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
516 resolve({ stanza = reply });
a9ad287c3388 core.moduleapi: Filter out unrelated direct replies to module:send_iq
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
517 end
a9ad287c3388 core.moduleapi: Filter out unrelated direct replies to module:send_iq
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
518 return (origin or hosts[self.host]).send(reply)
10705
2cffb5ce9f7a moduleapi: Fix handling of replies to :send_iq from internal modules
Kim Alvefur <zash@zash.se>
parents: 10595
diff changeset
519 end;
2cffb5ce9f7a moduleapi: Fix handling of replies to :send_iq from internal modules
Kim Alvefur <zash@zash.se>
parents: 10595
diff changeset
520 }, {
2cffb5ce9f7a moduleapi: Fix handling of replies to :send_iq from internal modules
Kim Alvefur <zash@zash.se>
parents: 10595
diff changeset
521 __index = origin or hosts[self.host];
2cffb5ce9f7a moduleapi: Fix handling of replies to :send_iq from internal modules
Kim Alvefur <zash@zash.se>
parents: 10595
diff changeset
522 });
2cffb5ce9f7a moduleapi: Fix handling of replies to :send_iq from internal modules
Kim Alvefur <zash@zash.se>
parents: 10595
diff changeset
523
2cffb5ce9f7a moduleapi: Fix handling of replies to :send_iq from internal modules
Kim Alvefur <zash@zash.se>
parents: 10595
diff changeset
524 self:send(stanza, wrapped_origin);
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
525 end);
10214
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
526
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
527 p:finally(function ()
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
528 local iq = iq_cache:get(cache_key);
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
529 if iq then
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
530 self:unhook(result_event, iq.result_handler);
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
531 self:unhook(error_event, iq.error_handler);
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
532 iq.timeout_handle:stop();
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
533 iq_cache:set(cache_key, nil);
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
534 end
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
535 end);
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
536
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
537 return p;
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
538 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
539
6651
deaa3d66dc2c moduleapi: Add module:broadcast() to send a stanza to a list of JIDs
Matthew Wild <mwild1@gmail.com>
parents: 6640
diff changeset
540 function api:broadcast(jids, stanza, iter)
deaa3d66dc2c moduleapi: Add module:broadcast() to send a stanza to a list of JIDs
Matthew Wild <mwild1@gmail.com>
parents: 6640
diff changeset
541 for jid in (iter or it.values)(jids) do
deaa3d66dc2c moduleapi: Add module:broadcast() to send a stanza to a list of JIDs
Matthew Wild <mwild1@gmail.com>
parents: 6640
diff changeset
542 local new_stanza = st.clone(stanza);
deaa3d66dc2c moduleapi: Add module:broadcast() to send a stanza to a list of JIDs
Matthew Wild <mwild1@gmail.com>
parents: 6640
diff changeset
543 new_stanza.attr.to = jid;
9042
734ba7080b35 moduleapi: Use :send API from :broadcast for compactness
Kim Alvefur <zash@zash.se>
parents: 8994
diff changeset
544 self:send(new_stanza);
6651
deaa3d66dc2c moduleapi: Add module:broadcast() to send a stanza to a list of JIDs
Matthew Wild <mwild1@gmail.com>
parents: 6640
diff changeset
545 end
deaa3d66dc2c moduleapi: Add module:broadcast() to send a stanza to a list of JIDs
Matthew Wild <mwild1@gmail.com>
parents: 6640
diff changeset
546 end
deaa3d66dc2c moduleapi: Add module:broadcast() to send a stanza to a list of JIDs
Matthew Wild <mwild1@gmail.com>
parents: 6640
diff changeset
547
5899
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
548 local timer_methods = { }
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
549 local timer_mt = {
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
550 __index = timer_methods;
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
551 }
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
552 function timer_methods:stop( )
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
553 timer.stop(self.id);
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
554 end
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
555 timer_methods.disarm = timer_methods.stop
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
556 function timer_methods:reschedule(delay)
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
557 timer.reschedule(self.id, delay)
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
558 end
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
559
7142
67226eaef97c moduleapi: Silence luacheck warning about unused 'id' parameter
Matthew Wild <mwild1@gmail.com>
parents: 7141
diff changeset
560 local function timer_callback(now, id, t) --luacheck: ignore 212/id
5899
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
561 if t.module_env.loaded == false then return; end
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
562 return t.callback(now, unpack(t, 1, t.n));
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
563 end
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
564
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
565 function api:add_timer(delay, callback, ...)
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
566 local t = pack(...)
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
567 t.module_env = self;
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
568 t.callback = callback;
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
569 t.id = timer.add_task(delay, timer_callback, t);
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
570 return setmetatable(t, timer_mt);
4666
fb522fbd495e moduleapi: Add module:add_timer(delay, callback) - automatically halts the timer on module unload
Matthew Wild <mwild1@gmail.com>
parents: 4663
diff changeset
571 end
fb522fbd495e moduleapi: Add module:add_timer(delay, callback) - automatically halts the timer on module unload
Matthew Wild <mwild1@gmail.com>
parents: 4663
diff changeset
572
11987
4b519c575ad0 core.moduleapi: Add API for adding daily or hourly tasks via mod_cron
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
573 function api:cron(task_spec)
4b519c575ad0 core.moduleapi: Add API for adding daily or hourly tasks via mod_cron
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
574 self:depends("cron");
4b519c575ad0 core.moduleapi: Add API for adding daily or hourly tasks via mod_cron
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
575 self:add_item("task", task_spec);
4b519c575ad0 core.moduleapi: Add API for adding daily or hourly tasks via mod_cron
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
576 end
4b519c575ad0 core.moduleapi: Add API for adding daily or hourly tasks via mod_cron
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
577
4b519c575ad0 core.moduleapi: Add API for adding daily or hourly tasks via mod_cron
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
578 function api:hourly(name, fun)
4b519c575ad0 core.moduleapi: Add API for adding daily or hourly tasks via mod_cron
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
579 if type(name) == "function" then fun, name = name, nil; end
4b519c575ad0 core.moduleapi: Add API for adding daily or hourly tasks via mod_cron
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
580 self:cron({ name = name; when = "hourly"; run = fun });
4b519c575ad0 core.moduleapi: Add API for adding daily or hourly tasks via mod_cron
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
581 end
4b519c575ad0 core.moduleapi: Add API for adding daily or hourly tasks via mod_cron
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
582
4b519c575ad0 core.moduleapi: Add API for adding daily or hourly tasks via mod_cron
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
583 function api:daily(name, fun)
4b519c575ad0 core.moduleapi: Add API for adding daily or hourly tasks via mod_cron
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
584 if type(name) == "function" then fun, name = name, nil; end
4b519c575ad0 core.moduleapi: Add API for adding daily or hourly tasks via mod_cron
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
585 self:cron({ name = name; when = "daily"; run = fun });
4b519c575ad0 core.moduleapi: Add API for adding daily or hourly tasks via mod_cron
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
586 end
4b519c575ad0 core.moduleapi: Add API for adding daily or hourly tasks via mod_cron
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
587
12002
cbed7d8d8f35 mod_cron: Add a 'weekly' job frequency
Kim Alvefur <zash@zash.se>
parents: 11987
diff changeset
588 function api:weekly(name, fun)
cbed7d8d8f35 mod_cron: Add a 'weekly' job frequency
Kim Alvefur <zash@zash.se>
parents: 11987
diff changeset
589 if type(name) == "function" then fun, name = name, nil; end
cbed7d8d8f35 mod_cron: Add a 'weekly' job frequency
Kim Alvefur <zash@zash.se>
parents: 11987
diff changeset
590 self:cron({ name = name; when = "weekly"; run = fun });
cbed7d8d8f35 mod_cron: Add a 'weekly' job frequency
Kim Alvefur <zash@zash.se>
parents: 11987
diff changeset
591 end
cbed7d8d8f35 mod_cron: Add a 'weekly' job frequency
Kim Alvefur <zash@zash.se>
parents: 11987
diff changeset
592
4790
8bf710b19f65 moduleapi: Add module:get_directory() to get module file's directory, and module:load_resource() to load a file relative to that directory
Matthew Wild <mwild1@gmail.com>
parents: 4750
diff changeset
593 local path_sep = package.config:sub(1,1);
8bf710b19f65 moduleapi: Add module:get_directory() to get module file's directory, and module:load_resource() to load a file relative to that directory
Matthew Wild <mwild1@gmail.com>
parents: 4750
diff changeset
594 function api:get_directory()
11148
1dc49accb58e core.moduleapi: Return resource path from module:get_directory() (API BC)
Kim Alvefur <zash@zash.se>
parents: 11146
diff changeset
595 return self.resource_path or self.path and (self.path:gsub("%"..path_sep.."[^"..path_sep.."]*$", "")) or nil;
4790
8bf710b19f65 moduleapi: Add module:get_directory() to get module file's directory, and module:load_resource() to load a file relative to that directory
Matthew Wild <mwild1@gmail.com>
parents: 4750
diff changeset
596 end
8bf710b19f65 moduleapi: Add module:get_directory() to get module file's directory, and module:load_resource() to load a file relative to that directory
Matthew Wild <mwild1@gmail.com>
parents: 4750
diff changeset
597
8bf710b19f65 moduleapi: Add module:get_directory() to get module file's directory, and module:load_resource() to load a file relative to that directory
Matthew Wild <mwild1@gmail.com>
parents: 4750
diff changeset
598 function api:load_resource(path, mode)
11148
1dc49accb58e core.moduleapi: Return resource path from module:get_directory() (API BC)
Kim Alvefur <zash@zash.se>
parents: 11146
diff changeset
599 path = resolve_relative_path(self:get_directory(), path);
4790
8bf710b19f65 moduleapi: Add module:get_directory() to get module file's directory, and module:load_resource() to load a file relative to that directory
Matthew Wild <mwild1@gmail.com>
parents: 4750
diff changeset
600 return io.open(path, mode);
8bf710b19f65 moduleapi: Add module:get_directory() to get module file's directory, and module:load_resource() to load a file relative to that directory
Matthew Wild <mwild1@gmail.com>
parents: 4750
diff changeset
601 end
8bf710b19f65 moduleapi: Add module:get_directory() to get module file's directory, and module:load_resource() to load a file relative to that directory
Matthew Wild <mwild1@gmail.com>
parents: 4750
diff changeset
602
6655
a99ed5f5f709 moduleapi: Minor variable renaming to avoid clashes with the 'type' function
Matthew Wild <mwild1@gmail.com>
parents: 6654
diff changeset
603 function api:open_store(name, store_type)
12662
07424992d7fc mod_authz_internal, and more: New iteration of role API
Matthew Wild <mwild1@gmail.com>
parents: 12652
diff changeset
604 if self.host == "*" then return nil, "global-storage-not-supported"; end
12972
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
605 return require"prosody.core.storagemanager".open(self.host, name or self.name, store_type);
5496
7a0b81b5ca71 moduleapi: Add module:open_store() as a front-end to storagemanager.open()
Matthew Wild <mwild1@gmail.com>
parents: 5434
diff changeset
606 end
7a0b81b5ca71 moduleapi: Add module:open_store() as a front-end to storagemanager.open()
Matthew Wild <mwild1@gmail.com>
parents: 5434
diff changeset
607
10885
2f751880767c core.moduleapi: Allow passing a config table trough :measure
Kim Alvefur <zash@zash.se>
parents: 10706
diff changeset
608 function api:measure(name, stat_type, conf)
12972
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
609 local measure = require "prosody.core.statsmanager".measure;
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
610 local fixed_label_key, fixed_label_value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
611 if self.host ~= "*" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
612 fixed_label_key = "host"
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
613 fixed_label_value = self.host
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
614 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
615 -- new_legacy_metric takes care of scoping for us, as it does not accept
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
616 -- an array of labels
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
617 -- the prosody_ prefix is automatically added by statsmanager for legacy
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
618 -- metrics.
11931
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11921
diff changeset
619 self:add_item("measure", { name = name, type = stat_type, conf = conf });
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
620 return measure(stat_type, "mod_"..self.name.."/"..name, conf, fixed_label_key, fixed_label_value)
6556
74253c7beb9c moduleapi: Module API for statsmanager
Matthew Wild <mwild1@gmail.com>
parents: 6422
diff changeset
621 end
74253c7beb9c moduleapi: Module API for statsmanager
Matthew Wild <mwild1@gmail.com>
parents: 6422
diff changeset
622
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
623 function api:metric(type_, name, unit, description, label_keys, conf)
12972
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
624 local metric = require "prosody.core.statsmanager".metric;
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
625 local is_scoped = self.host ~= "*"
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
626 if is_scoped then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
627 -- prepend `host` label to label keys if this is not a global module
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
628 local orig_labels = label_keys
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
629 label_keys = array { "host" }
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
630 label_keys:append(orig_labels)
6639
3003d041c159 moduleapi: Experimental API for modules to measure the rate+duration of events
Matthew Wild <mwild1@gmail.com>
parents: 6556
diff changeset
631 end
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
632 local mf = metric(type_, "prosody_mod_"..self.name.."/"..name, unit, description, label_keys, conf)
11931
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11921
diff changeset
633 self:add_item("metric", { name = name, mf = mf });
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
634 if is_scoped then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
635 -- make sure to scope the returned metric family to the current host
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
636 return mf:with_partial_label(self.host)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
637 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
638 return mf
6639
3003d041c159 moduleapi: Experimental API for modules to measure the rate+duration of events
Matthew Wild <mwild1@gmail.com>
parents: 6556
diff changeset
639 end
3003d041c159 moduleapi: Experimental API for modules to measure the rate+duration of events
Matthew Wild <mwild1@gmail.com>
parents: 6556
diff changeset
640
9866
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
641 local status_priorities = { error = 3, warn = 2, info = 1, core = 0 };
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
642
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
643 function api:set_status(status_type, status_message, override)
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
644 local priority = status_priorities[status_type];
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
645 if not priority then
12874
b9468c8ac1d3 core.moduleapi: Fix passing variable to logging
Kim Alvefur <zash@zash.se>
parents: 12690
diff changeset
646 self:log("error", "set_status: Invalid status type '%s', assuming 'info'", status_type);
9866
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
647 status_type, priority = "info", status_priorities.info;
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
648 end
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
649 local current_priority = status_priorities[self.status_type] or 0;
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
650 -- By default an 'error' status can only be overwritten by another 'error' status
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
651 if (current_priority >= status_priorities.error and priority < current_priority and override ~= true)
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
652 or (override == false and current_priority > priority) then
9930
12a31296d63d moduleapi: Log suppressed status priority and message when not overriding
Matthew Wild <mwild1@gmail.com>
parents: 9929
diff changeset
653 self:log("debug", "moduleapi: ignoring status [prio %d override %s]: %s", priority, override, status_message);
9866
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
654 return;
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
655 end
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
656 self.status_type, self.status_message, self.status_time = status_type, status_message, time_now();
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
657 self:fire_event("module-status/updated", { name = self.name });
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
658 end
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
659
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
660 function api:log_status(level, msg, ...)
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
661 self:set_status(level, format(msg, ...));
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
662 return self:log(level, msg, ...);
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
663 end
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
664
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
665 function api:get_status()
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
666 return self.status_type, self.status_message, self.status_time;
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
667 end
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
668
12642
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
669 function api:default_permission(role_name, permission)
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
670 permission = permission:gsub("^:", self.name..":");
12650
e08bf2ad67da moduleapi: Distribute permissions set from global modules to all hosts
Kim Alvefur <zash@zash.se>
parents: 12645
diff changeset
671 if self.host == "*" then
e08bf2ad67da moduleapi: Distribute permissions set from global modules to all hosts
Kim Alvefur <zash@zash.se>
parents: 12645
diff changeset
672 for _, host in pairs(hosts) do
e08bf2ad67da moduleapi: Distribute permissions set from global modules to all hosts
Kim Alvefur <zash@zash.se>
parents: 12645
diff changeset
673 if host.authz then
e08bf2ad67da moduleapi: Distribute permissions set from global modules to all hosts
Kim Alvefur <zash@zash.se>
parents: 12645
diff changeset
674 host.authz.add_default_permission(role_name, permission);
e08bf2ad67da moduleapi: Distribute permissions set from global modules to all hosts
Kim Alvefur <zash@zash.se>
parents: 12645
diff changeset
675 end
e08bf2ad67da moduleapi: Distribute permissions set from global modules to all hosts
Kim Alvefur <zash@zash.se>
parents: 12645
diff changeset
676 end
e08bf2ad67da moduleapi: Distribute permissions set from global modules to all hosts
Kim Alvefur <zash@zash.se>
parents: 12645
diff changeset
677 return
e08bf2ad67da moduleapi: Distribute permissions set from global modules to all hosts
Kim Alvefur <zash@zash.se>
parents: 12645
diff changeset
678 end
12642
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
679 hosts[self.host].authz.add_default_permission(role_name, permission);
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
680 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
681
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
682 function api:default_permissions(role_name, permissions)
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
683 for _, permission in ipairs(permissions) do
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
684 self:default_permission(role_name, permission);
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
685 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
686 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
687
12995
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
688 function api:could(action, context)
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
689 return self:may(action, context, true);
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
690 end
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
691
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
692 function api:may(action, context, peek)
12645
a741183eec97 core.moduleapi: Expand permission name ':' prefix earlier
Kim Alvefur <zash@zash.se>
parents: 12644
diff changeset
693 if action:byte(1) == 58 then -- action begins with ':'
a741183eec97 core.moduleapi: Expand permission name ':' prefix earlier
Kim Alvefur <zash@zash.se>
parents: 12644
diff changeset
694 action = self.name..action; -- prepend module name
a741183eec97 core.moduleapi: Expand permission name ':' prefix earlier
Kim Alvefur <zash@zash.se>
parents: 12644
diff changeset
695 end
12642
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
696 if type(context) == "string" then -- check JID permissions
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
697 local role;
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
698 local node, host = jid_split(context);
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
699 if host == self.host then
12662
07424992d7fc mod_authz_internal, and more: New iteration of role API
Matthew Wild <mwild1@gmail.com>
parents: 12652
diff changeset
700 role = hosts[host].authz.get_user_role(node);
12642
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
701 else
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
702 role = hosts[self.host].authz.get_jid_role(context);
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
703 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
704 if not role then
12995
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
705 if not peek then
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
706 self:log("debug", "Access denied: JID <%s> may not %s (no role found)", context, action);
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
707 end
12642
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
708 return false;
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
709 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
710 local permit = role:may(action);
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
711 if not permit then
12995
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
712 if not peek then
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
713 self:log("debug", "Access denied: JID <%s> may not %s (not permitted by role %s)", context, action, role.name);
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
714 end
12642
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
715 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
716 return permit;
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
717 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
718
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
719 local session = context.origin or context.session;
12652
30e2a0107217 moduleapi: Stricter type check for actor in permission check
Kim Alvefur <zash@zash.se>
parents: 12651
diff changeset
720 if type(session) ~= "table" then
12642
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
721 error("Unable to identify actor session from context");
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
722 end
12994
5625da6ae6b6 moduleapi: may: Fail early if a local session has no role assigned
Matthew Wild <mwild1@gmail.com>
parents: 12972
diff changeset
723 if session.type == "c2s" and session.host == self.host then
5625da6ae6b6 moduleapi: may: Fail early if a local session has no role assigned
Matthew Wild <mwild1@gmail.com>
parents: 12972
diff changeset
724 local role = session.role;
5625da6ae6b6 moduleapi: may: Fail early if a local session has no role assigned
Matthew Wild <mwild1@gmail.com>
parents: 12972
diff changeset
725 if not role then
12995
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
726 if not peek then
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
727 self:log("warn", "Access denied: session %s has no role assigned");
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
728 end
12994
5625da6ae6b6 moduleapi: may: Fail early if a local session has no role assigned
Matthew Wild <mwild1@gmail.com>
parents: 12972
diff changeset
729 return false;
5625da6ae6b6 moduleapi: may: Fail early if a local session has no role assigned
Matthew Wild <mwild1@gmail.com>
parents: 12972
diff changeset
730 end
5625da6ae6b6 moduleapi: may: Fail early if a local session has no role assigned
Matthew Wild <mwild1@gmail.com>
parents: 12972
diff changeset
731 local permit = role:may(action, context);
12995
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
732 if not permit and not peek then
12690
546c7e0f3f31 core.moduleapi: Check for local role-aware sessions before e.g. s2s
Kim Alvefur <zash@zash.se>
parents: 12662
diff changeset
733 self:log("debug", "Access denied: session %s (%s) may not %s (not permitted by role %s)",
12994
5625da6ae6b6 moduleapi: may: Fail early if a local session has no role assigned
Matthew Wild <mwild1@gmail.com>
parents: 12972
diff changeset
734 session.id, session.full_jid, action, role.name
12690
546c7e0f3f31 core.moduleapi: Check for local role-aware sessions before e.g. s2s
Kim Alvefur <zash@zash.se>
parents: 12662
diff changeset
735 );
546c7e0f3f31 core.moduleapi: Check for local role-aware sessions before e.g. s2s
Kim Alvefur <zash@zash.se>
parents: 12662
diff changeset
736 end
546c7e0f3f31 core.moduleapi: Check for local role-aware sessions before e.g. s2s
Kim Alvefur <zash@zash.se>
parents: 12662
diff changeset
737 return permit;
546c7e0f3f31 core.moduleapi: Check for local role-aware sessions before e.g. s2s
Kim Alvefur <zash@zash.se>
parents: 12662
diff changeset
738 else
12642
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
739 local actor_jid = context.stanza.attr.from;
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
740 local role = hosts[self.host].authz.get_jid_role(actor_jid);
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
741 if not role then
12995
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
742 if not peek then
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
743 self:log("debug", "Access denied: JID <%s> may not %s (no role found)", actor_jid, action);
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
744 end
12642
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
745 return false;
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
746 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
747 local permit = role:may(action, context);
12995
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
748 if not permit and not peek then
12642
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
749 self:log("debug", "Access denied: JID <%s> may not %s (not permitted by role %s)", actor_jid, action, role.name);
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
750 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
751 return permit;
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
752 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
753 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
754
13015
46c05c2e34f7 moduleapi: Add module:once() to execute a function after module load/startup
Matthew Wild <mwild1@gmail.com>
parents: 12995
diff changeset
755 -- Execute a function, once, but only after startup is complete
13016
8aec903ea888 moduleapi: Add luacheck annotation to suppress warning about unused self
Matthew Wild <mwild1@gmail.com>
parents: 13015
diff changeset
756 function api:once(f) --luacheck: ignore 212/self
13015
46c05c2e34f7 moduleapi: Add module:once() to execute a function after module load/startup
Matthew Wild <mwild1@gmail.com>
parents: 12995
diff changeset
757 return prosody.started:next(f);
46c05c2e34f7 moduleapi: Add module:once() to execute a function after module load/startup
Matthew Wild <mwild1@gmail.com>
parents: 12995
diff changeset
758 end
46c05c2e34f7 moduleapi: Add module:once() to execute a function after module load/startup
Matthew Wild <mwild1@gmail.com>
parents: 12995
diff changeset
759
6422
6d4d87a89026 core.module{manager,api}: Fix for 010b141e91ed (Thanks v1ct0r)
Kim Alvefur <zash@zash.se>
parents: 6415
diff changeset
760 return api;