Annotate

core/moduleapi.lua @ 13233:37d67b5f9768

mod_muc: Use enum config API for 'restrict_room_creation' This communicates the accepted values in case the config diverges from them. Note that older documentation used an "admin" value behaving like an alias to true, but this is no longer handled. Should it?
author Kim Alvefur <zash@zash.se>
date Fri, 21 Jul 2023 22:49:01 +0200
parent 13215:b1c2e70de470
child 13237:59c3d775c7fa
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)
13215
b1c2e70de470 core.moduleapi: Fix min/maxinteger fallback for Lua 5.2
Kim Alvefur <zash@zash.se>
parents: 13212
diff changeset
258 local value = self:get_option_number(name, default_value, min or math.mininteger or -2 ^ 52, max or math.maxinteger or 2 ^ 53);
13211
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
13212
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
271 function api:get_option_period(name, default_value, min, max)
13204
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);
13212
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
273
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
274 local ret;
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
275 if 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
276 -- 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
277 return math.huge;
13212
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
278 elseif type(value) == "number" then
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
279 -- assume seconds
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
280 ret = value;
13205
0ccd82b965d5 core.moduleapi: Improve handling of different types in :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13204
diff changeset
281 elseif type(value) == "string" then
13212
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
282 ret = human_io.parse_duration(value);
13205
0ccd82b965d5 core.moduleapi: Improve handling of different types in :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13204
diff changeset
283 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
284 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
285 end
13207
c563da1694bf core.moduleapi: Log error for unexpected types (booleans?) set as periods
Kim Alvefur <zash@zash.se>
parents: 13206
diff changeset
286 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
287 self:log("error", "Config option '%s' expects a number or a period description string (e.g. \"3 hours\"), not %s", name, type(value));
13212
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
288 return nil;
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
289 else
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
290 return nil;
13204
c9ef35fab0b1 core.moduleapi: Add :get_option_period for parsing time intervals
Kim Alvefur <zash@zash.se>
parents: 13203
diff changeset
291 end
13212
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
292
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
293 if ret < 0 then
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
294 self:log("debug", "Treating negative period as infinity");
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
295 return math.huge;
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
296 end
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
297
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
298 if min and ret < min then
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
299 self:log("warn", "Config option '%s' out of bounds %g < %g", name, ret, min);
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
300 return min;
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
301 end
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
302 if max and ret > max then
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
303 self:log("warn", "Config option '%s' out of bounds %g > %g", name, ret, max);
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
304 return max;
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
305 end
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
306
3e6e98cc63e9 core.moduleapi: Add min/max range support to :get_option_period
Kim Alvefur <zash@zash.se>
parents: 13211
diff changeset
307 return ret;
13204
c9ef35fab0b1 core.moduleapi: Add :get_option_period for parsing time intervals
Kim Alvefur <zash@zash.se>
parents: 13203
diff changeset
308 end
c9ef35fab0b1 core.moduleapi: Add :get_option_period for parsing time intervals
Kim Alvefur <zash@zash.se>
parents: 13203
diff changeset
309
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
310 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
311 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
312 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
313 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
314 end
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 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
316 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
317 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
318 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
319 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
320 else
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
321 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
322 end
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
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
324 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
325 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
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 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
328 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
329
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
330 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
331 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
332
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
333 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
334 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
335 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5771
diff changeset
336
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
337 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
338 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
339 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5771
diff changeset
340
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
341 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
342 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
343
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
344 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
345 local value = self:get_option_array(name, ...);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5771
diff changeset
346
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
347 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
348 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
349 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5771
diff changeset
350
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
351 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
352 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
353
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
354 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
355 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
356 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
357 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
358 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
359 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
360 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
361 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
362 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
363 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
364 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
365
7127
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
366 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
367 if parent == nil then
9509
b57353f76c83 core.moduleapi: Remove redundant condition
Kim Alvefur <zash@zash.se>
parents: 9149
diff changeset
368 parent = self:get_directory();
7127
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
369 elseif prosody.paths[parent] then
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
370 parent = prosody.paths[parent];
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
371 end
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
372 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
373 if value == nil then
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
374 return nil;
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
375 end
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
376 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
377 end
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
378
13201
65fb0d7a2312 moduleapi: Add enum config option method
Kim Alvefur <zash@zash.se>
parents: 13016
diff changeset
379 function api:get_option_enum(name, default, ...)
65fb0d7a2312 moduleapi: Add enum config option method
Kim Alvefur <zash@zash.se>
parents: 13016
diff changeset
380 local value = self:get_option_scalar(name, default);
65fb0d7a2312 moduleapi: Add enum config option method
Kim Alvefur <zash@zash.se>
parents: 13016
diff changeset
381 if value == nil then return nil; end
65fb0d7a2312 moduleapi: Add enum config option method
Kim Alvefur <zash@zash.se>
parents: 13016
diff changeset
382 local options = set.new{default, ...};
65fb0d7a2312 moduleapi: Add enum config option method
Kim Alvefur <zash@zash.se>
parents: 13016
diff changeset
383 if not options:contains(value) then
65fb0d7a2312 moduleapi: Add enum config option method
Kim Alvefur <zash@zash.se>
parents: 13016
diff changeset
384 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
385 end
65fb0d7a2312 moduleapi: Add enum config option method
Kim Alvefur <zash@zash.se>
parents: 13016
diff changeset
386 return value;
65fb0d7a2312 moduleapi: Add enum config option method
Kim Alvefur <zash@zash.se>
parents: 13016
diff changeset
387 end
7127
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
388
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
389 function api:context(host)
12479
4d36fbcdd210 core.moduleapi: Fix 'global' property via :context() - #1748
Kim Alvefur <zash@zash.se>
parents: 12253
diff changeset
390 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
391 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
392
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
393 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
394 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
395 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
396 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
397 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
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 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
400 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
401 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
402 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
403 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
404 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
405 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
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
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
410 function api:get_host_items(key)
12972
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12921
diff changeset
411 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
412 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
413 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
414 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
415
6655
a99ed5f5f709 moduleapi: Minor variable renaming to avoid clashes with the 'type' function
Matthew Wild <mwild1@gmail.com>
parents: 6654
diff changeset
416 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
417 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
418 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
419 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
420 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
421 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
422 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
423 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
424 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
425
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
426 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
427 -- 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
428 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
429 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
430 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
431 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
432 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
433 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
434 if not item.name then
4660
96b40b5e8ea8 moduleapi: module:provides(): Fix usage of wrong table
Matthew Wild <mwild1@gmail.com>
parents: 4651
diff changeset
435 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
436 -- 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
437 -- (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
438 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
439 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
440 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
441 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
442 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
443 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
444 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
445 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
446
7342
79a5db780e8b moduleapi: Allow an origin session to be passed to module:send()
Kim Alvefur <zash@zash.se>
parents: 7163
diff changeset
447 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
448 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
449 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
450
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
451 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
452 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
453 if not iq_cache then
9747
c8240f931a68 core.moduleapi: Move util imports to top
Kim Alvefur <zash@zash.se>
parents: 9733
diff changeset
454 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
455 iq.reject(errors.new({
9748
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
456 type = "wait", condition = "resource-constraint",
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
457 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
458 }));
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
459 end);
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
460 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
461 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
462
10214
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
463 local event_type;
10595
17bab303daf5 core.moduleapi: Hook correct event type in some cases
Kim Alvefur <zash@zash.se>
parents: 10576
diff changeset
464 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
465 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
466 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
467 event_type = "full";
10214
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
468 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
469 event_type = "bare";
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
470 end
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
471 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
472 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
473 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
474 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
475 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
476 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
477 end
10214
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
478
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
479 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
480 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
481 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
482 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
483 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
484 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
485 end
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
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
488 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
489 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
490 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
491 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
492 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
493 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
494 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
495
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
496 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
497 reject(errors.new({
9748
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
498 type = "modify", condition = "conflict",
10213
ee62754b0233 core.moduleapi: Uppercase "IQ stanza" for consistency
Kim Alvefur <zash@zash.se>
parents: 9930
diff changeset
499 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
500 }));
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
501 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
502 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
503
11823
36a7a3137d41 core.moduleapi: Ensure module:send_iq() handler priority over mod_iq
Kim Alvefur <zash@zash.se>
parents: 11822
diff changeset
504 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
505 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
506
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
507 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
508 reject(errors.new({
9748
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
509 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
510 text = "IQ stanza timed out",
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
511 }));
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
512 end);
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
513
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
514 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
515 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
516 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
517 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
518 });
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
519
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
520 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
521 reject(errors.new({
9748
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
522 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
523 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
524 }));
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 return;
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
526 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
527
10705
2cffb5ce9f7a moduleapi: Fix handling of replies to :send_iq from internal modules
Kim Alvefur <zash@zash.se>
parents: 10595
diff changeset
528 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
529 -- 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
530 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
531 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
532 resolve({ stanza = reply });
a9ad287c3388 core.moduleapi: Filter out unrelated direct replies to module:send_iq
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
533 end
a9ad287c3388 core.moduleapi: Filter out unrelated direct replies to module:send_iq
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
534 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
535 end;
2cffb5ce9f7a moduleapi: Fix handling of replies to :send_iq from internal modules
Kim Alvefur <zash@zash.se>
parents: 10595
diff changeset
536 }, {
2cffb5ce9f7a moduleapi: Fix handling of replies to :send_iq from internal modules
Kim Alvefur <zash@zash.se>
parents: 10595
diff changeset
537 __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
538 });
2cffb5ce9f7a moduleapi: Fix handling of replies to :send_iq from internal modules
Kim Alvefur <zash@zash.se>
parents: 10595
diff changeset
539
2cffb5ce9f7a moduleapi: Fix handling of replies to :send_iq from internal modules
Kim Alvefur <zash@zash.se>
parents: 10595
diff changeset
540 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
541 end);
10214
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
542
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
543 p:finally(function ()
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
544 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
545 if iq then
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
546 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
547 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
548 iq.timeout_handle:stop();
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
549 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
550 end
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
551 end);
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
552
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
553 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
554 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
555
6651
deaa3d66dc2c moduleapi: Add module:broadcast() to send a stanza to a list of JIDs
Matthew Wild <mwild1@gmail.com>
parents: 6640
diff changeset
556 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
557 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
558 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
559 new_stanza.attr.to = jid;
9042
734ba7080b35 moduleapi: Use :send API from :broadcast for compactness
Kim Alvefur <zash@zash.se>
parents: 8994
diff changeset
560 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
561 end
deaa3d66dc2c moduleapi: Add module:broadcast() to send a stanza to a list of JIDs
Matthew Wild <mwild1@gmail.com>
parents: 6640
diff changeset
562 end
deaa3d66dc2c moduleapi: Add module:broadcast() to send a stanza to a list of JIDs
Matthew Wild <mwild1@gmail.com>
parents: 6640
diff changeset
563
5899
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
564 local timer_methods = { }
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
565 local timer_mt = {
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
566 __index = timer_methods;
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
567 }
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
568 function timer_methods:stop( )
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
569 timer.stop(self.id);
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
570 end
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
571 timer_methods.disarm = timer_methods.stop
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
572 function timer_methods:reschedule(delay)
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
573 timer.reschedule(self.id, delay)
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
574 end
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
575
7142
67226eaef97c moduleapi: Silence luacheck warning about unused 'id' parameter
Matthew Wild <mwild1@gmail.com>
parents: 7141
diff changeset
576 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
577 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
578 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
579 end
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
580
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
581 function api:add_timer(delay, callback, ...)
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
582 local t = pack(...)
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
583 t.module_env = self;
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
584 t.callback = callback;
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
585 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
586 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
587 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
588
11987
4b519c575ad0 core.moduleapi: Add API for adding daily or hourly tasks via mod_cron
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
589 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
590 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
591 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
592 end
4b519c575ad0 core.moduleapi: Add API for adding daily or hourly tasks via mod_cron
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
593
4b519c575ad0 core.moduleapi: Add API for adding daily or hourly tasks via mod_cron
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
594 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
595 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
596 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
597 end
4b519c575ad0 core.moduleapi: Add API for adding daily or hourly tasks via mod_cron
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
598
4b519c575ad0 core.moduleapi: Add API for adding daily or hourly tasks via mod_cron
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
599 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
600 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
601 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
602 end
4b519c575ad0 core.moduleapi: Add API for adding daily or hourly tasks via mod_cron
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
603
12002
cbed7d8d8f35 mod_cron: Add a 'weekly' job frequency
Kim Alvefur <zash@zash.se>
parents: 11987
diff changeset
604 function api:weekly(name, fun)
cbed7d8d8f35 mod_cron: Add a 'weekly' job frequency
Kim Alvefur <zash@zash.se>
parents: 11987
diff changeset
605 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
606 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
607 end
cbed7d8d8f35 mod_cron: Add a 'weekly' job frequency
Kim Alvefur <zash@zash.se>
parents: 11987
diff changeset
608
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
609 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
610 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
611 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
612 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
613
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
614 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
615 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
616 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
617 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
618
6655
a99ed5f5f709 moduleapi: Minor variable renaming to avoid clashes with the 'type' function
Matthew Wild <mwild1@gmail.com>
parents: 6654
diff changeset
619 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
620 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
621 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
622 end
7a0b81b5ca71 moduleapi: Add module:open_store() as a front-end to storagemanager.open()
Matthew Wild <mwild1@gmail.com>
parents: 5434
diff changeset
623
10885
2f751880767c core.moduleapi: Allow passing a config table trough :measure
Kim Alvefur <zash@zash.se>
parents: 10706
diff changeset
624 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
625 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
626 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
627 if self.host ~= "*" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
628 fixed_label_key = "host"
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
629 fixed_label_value = self.host
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
630 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
631 -- 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
632 -- an array of labels
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
633 -- 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
634 -- metrics.
11931
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11921
diff changeset
635 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
636 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
637 end
74253c7beb9c moduleapi: Module API for statsmanager
Matthew Wild <mwild1@gmail.com>
parents: 6422
diff changeset
638
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
639 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
640 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
641 local is_scoped = self.host ~= "*"
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
642 if is_scoped then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
643 -- 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
644 local orig_labels = label_keys
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
645 label_keys = array { "host" }
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
646 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
647 end
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
648 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
649 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
650 if is_scoped then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
651 -- 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
652 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
653 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
654 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
655 end
3003d041c159 moduleapi: Experimental API for modules to measure the rate+duration of events
Matthew Wild <mwild1@gmail.com>
parents: 6556
diff changeset
656
9866
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
657 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
658
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
659 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
660 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
661 if not priority then
12874
b9468c8ac1d3 core.moduleapi: Fix passing variable to logging
Kim Alvefur <zash@zash.se>
parents: 12690
diff changeset
662 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
663 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
664 end
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
665 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
666 -- 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
667 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
668 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
669 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
670 return;
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
671 end
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
672 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
673 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
674 end
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
675
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
676 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
677 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
678 return self:log(level, msg, ...);
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
679 end
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
680
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
681 function api:get_status()
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
682 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
683 end
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
684
12642
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
685 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
686 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
687 if self.host == "*" then
e08bf2ad67da moduleapi: Distribute permissions set from global modules to all hosts
Kim Alvefur <zash@zash.se>
parents: 12645
diff changeset
688 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
689 if host.authz then
e08bf2ad67da moduleapi: Distribute permissions set from global modules to all hosts
Kim Alvefur <zash@zash.se>
parents: 12645
diff changeset
690 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
691 end
e08bf2ad67da moduleapi: Distribute permissions set from global modules to all hosts
Kim Alvefur <zash@zash.se>
parents: 12645
diff changeset
692 end
e08bf2ad67da moduleapi: Distribute permissions set from global modules to all hosts
Kim Alvefur <zash@zash.se>
parents: 12645
diff changeset
693 return
e08bf2ad67da moduleapi: Distribute permissions set from global modules to all hosts
Kim Alvefur <zash@zash.se>
parents: 12645
diff changeset
694 end
12642
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
695 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
696 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
697
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
698 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
699 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
700 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
701 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
702 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
703
12995
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
704 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
705 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
706 end
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
707
e385f3a06673 moduleapi: Add 'peek' to :may() and new :could() helper to suppress logging
Matthew Wild <mwild1@gmail.com>
parents: 12994
diff changeset
708 function api:may(action, context, peek)
12645
a741183eec97 core.moduleapi: Expand permission name ':' prefix earlier
Kim Alvefur <zash@zash.se>
parents: 12644
diff changeset
709 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
710 action = self.name..action; -- prepend module name
a741183eec97 core.moduleapi: Expand permission name ':' prefix earlier
Kim Alvefur <zash@zash.se>
parents: 12644
diff changeset
711 end
12642
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
712 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
713 local role;
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
714 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
715 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
716 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
717 else
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
718 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
719 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
720 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
721 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
722 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
723 end
12642
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
724 return false;
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
725 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
726 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
727 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
728 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
729 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
730 end
12642
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
731 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
732 return permit;
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
733 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
734
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
735 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
736 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
737 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
738 end
12994
5625da6ae6b6 moduleapi: may: Fail early if a local session has no role assigned
Matthew Wild <mwild1@gmail.com>
parents: 12972
diff changeset
739 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
740 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
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("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
744 end
12994
5625da6ae6b6 moduleapi: may: Fail early if a local session has no role assigned
Matthew Wild <mwild1@gmail.com>
parents: 12972
diff changeset
745 return false;
5625da6ae6b6 moduleapi: may: Fail early if a local session has no role assigned
Matthew Wild <mwild1@gmail.com>
parents: 12972
diff changeset
746 end
5625da6ae6b6 moduleapi: may: Fail early if a local session has no role assigned
Matthew Wild <mwild1@gmail.com>
parents: 12972
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
12690
546c7e0f3f31 core.moduleapi: Check for local role-aware sessions before e.g. s2s
Kim Alvefur <zash@zash.se>
parents: 12662
diff changeset
749 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
750 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
751 );
546c7e0f3f31 core.moduleapi: Check for local role-aware sessions before e.g. s2s
Kim Alvefur <zash@zash.se>
parents: 12662
diff changeset
752 end
546c7e0f3f31 core.moduleapi: Check for local role-aware sessions before e.g. s2s
Kim Alvefur <zash@zash.se>
parents: 12662
diff changeset
753 return permit;
546c7e0f3f31 core.moduleapi: Check for local role-aware sessions before e.g. s2s
Kim Alvefur <zash@zash.se>
parents: 12662
diff changeset
754 else
12642
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
755 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
756 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
757 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
758 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
759 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
760 end
12642
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
761 return false;
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
762 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
763 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
764 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
765 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
766 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
767 return permit;
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
768 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
769 end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12590
diff changeset
770
13015
46c05c2e34f7 moduleapi: Add module:once() to execute a function after module load/startup
Matthew Wild <mwild1@gmail.com>
parents: 12995
diff changeset
771 -- 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
772 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
773 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
774 end
46c05c2e34f7 moduleapi: Add module:once() to execute a function after module load/startup
Matthew Wild <mwild1@gmail.com>
parents: 12995
diff changeset
775
6422
6d4d87a89026 core.module{manager,api}: Fix for 010b141e91ed (Thanks v1ct0r)
Kim Alvefur <zash@zash.se>
parents: 6415
diff changeset
776 return api;