Mercurial > prosody-hg
comparison plugins/mod_external_services.lua @ 11040:c560531d9a6e
mod_external_services: Validate services added via events
While writing developer documentation it became obvious that i was silly
to have one item format for config and items API, and another format for
the event API.
Then there's the stanza format, but that's a common pattern.
This change reduces the possible input formats to two and allows other
modules the benefit of the processing and validation performed on items
from the config.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Mon, 17 Aug 2020 00:24:11 +0200 |
| parents | ec6919401790 |
| children | ef62d29c8fdc |
comparison
equal
deleted
inserted
replaced
| 11039:ec6919401790 | 11040:c560531d9a6e |
|---|---|
| 2 local dt = require "util.datetime"; | 2 local dt = require "util.datetime"; |
| 3 local base64 = require "util.encodings".base64; | 3 local base64 = require "util.encodings".base64; |
| 4 local hashes = require "util.hashes"; | 4 local hashes = require "util.hashes"; |
| 5 local st = require "util.stanza"; | 5 local st = require "util.stanza"; |
| 6 local jid = require "util.jid"; | 6 local jid = require "util.jid"; |
| 7 local array = require "util.array"; | |
| 7 | 8 |
| 8 local default_host = module:get_option_string("external_service_host", module.host); | 9 local default_host = module:get_option_string("external_service_host", module.host); |
| 9 local default_port = module:get_option_number("external_service_port"); | 10 local default_port = module:get_option_number("external_service_port"); |
| 10 local default_secret = module:get_option_string("external_service_secret"); | 11 local default_secret = module:get_option_string("external_service_secret"); |
| 11 local default_ttl = module:get_option_number("external_service_ttl", 86400); | 12 local default_ttl = module:get_option_number("external_service_ttl", 86400); |
| 103 if #services == 0 then | 104 if #services == 0 then |
| 104 module:log("warn", "No services configured or all had errors"); | 105 module:log("warn", "No services configured or all had errors"); |
| 105 end | 106 end |
| 106 end | 107 end |
| 107 | 108 |
| 109 -- Ensure only valid items are added in events | |
| 110 local services_mt = { | |
| 111 __index = getmetatable(array()).__index; | |
| 112 __newindex = function (self, i, v) | |
| 113 rawset(self, i, assert(prepare(v), "Invalid service entry added")); | |
| 114 end; | |
| 115 } | |
| 116 | |
| 108 local function handle_services(event) | 117 local function handle_services(event) |
| 109 local origin, stanza = event.origin, event.stanza; | 118 local origin, stanza = event.origin, event.stanza; |
| 110 local action = stanza.tags[1]; | 119 local action = stanza.tags[1]; |
| 111 | 120 |
| 112 local user_bare = jid.bare(stanza.attr.from); | 121 local user_bare = jid.bare(stanza.attr.from); |
| 124 if requested_type then | 133 if requested_type then |
| 125 services:filter(function(item) | 134 services:filter(function(item) |
| 126 return item.type == requested_type; | 135 return item.type == requested_type; |
| 127 end); | 136 end); |
| 128 end | 137 end |
| 138 | |
| 139 setmetatable(services, services_mt); | |
| 129 | 140 |
| 130 module:fire_event("external_service/services", { | 141 module:fire_event("external_service/services", { |
| 131 origin = origin; | 142 origin = origin; |
| 132 stanza = stanza; | 143 stanza = stanza; |
| 133 reply = reply; | 144 reply = reply; |
| 174 type = service.attr.type; | 185 type = service.attr.type; |
| 175 host = service.attr.host; | 186 host = service.attr.host; |
| 176 port = tonumber(service.attr.port); | 187 port = tonumber(service.attr.port); |
| 177 }); | 188 }); |
| 178 end | 189 end |
| 190 | |
| 191 setmetatable(services, services_mt); | |
| 192 setmetatable(requested_credentials, services_mt); | |
| 179 | 193 |
| 180 module:fire_event("external_service/credentials", { | 194 module:fire_event("external_service/credentials", { |
| 181 origin = origin; | 195 origin = origin; |
| 182 stanza = stanza; | 196 stanza = stanza; |
| 183 reply = reply; | 197 reply = reply; |
