Software / code / prosody
Comparison
plugins/mod_external_services.lua @ 11038:efefdf71373b
mod_external_services: Prepare to allow more credential algorithms
Not sure what algorithms might fit here. Separation makes some sense.
This is also a preparation for having a callback. (See next commit)
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 25 Jul 2020 12:09:19 +0200 |
| parent | 11037:936ee55e1ae3 |
| child | 11039:ec6919401790 |
comparison
equal
deleted
inserted
replaced
| 11037:936ee55e1ae3 | 11038:efefdf71373b |
|---|---|
| 11 local default_ttl = module:get_option_number("external_service_ttl", 86400); | 11 local default_ttl = module:get_option_number("external_service_ttl", 86400); |
| 12 | 12 |
| 13 local configured_services = module:get_option_array("external_services", {}); | 13 local configured_services = module:get_option_array("external_services", {}); |
| 14 | 14 |
| 15 local access = module:get_option_set("external_service_access", {}); | 15 local access = module:get_option_set("external_service_access", {}); |
| 16 | |
| 17 -- https://tools.ietf.org/html/draft-uberti-behave-turn-rest-00 | |
| 18 local function behave_turn_rest_credentials(srv, item, secret) | |
| 19 local ttl = default_ttl; | |
| 20 if type(item.ttl) == "number" then | |
| 21 ttl = item.ttl; | |
| 22 end | |
| 23 local expires = srv.expires or os.time() + ttl; | |
| 24 local username; | |
| 25 if type(item.username) == "string" then | |
| 26 username = string.format("%d:%s", expires, item.username); | |
| 27 else | |
| 28 username = string.format("%d", expires); | |
| 29 end | |
| 30 srv.username = username; | |
| 31 srv.password = base64.encode(hashes.hmac_sha1(secret, srv.username)); | |
| 32 end | |
| 33 | |
| 34 local algorithms = { | |
| 35 turn = behave_turn_rest_credentials; | |
| 36 } | |
| 16 | 37 |
| 17 -- filter config into well-defined service records | 38 -- filter config into well-defined service records |
| 18 local function prepare(item) | 39 local function prepare(item) |
| 19 if type(item) ~= "table" then | 40 if type(item) ~= "table" then |
| 20 module:log("error", "Service definition is not a table: %q", item); | 41 module:log("error", "Service definition is not a table: %q", item); |
| 61 srv.expires = item.expires; | 82 srv.expires = item.expires; |
| 62 elseif type(item.ttl) == "number" then | 83 elseif type(item.ttl) == "number" then |
| 63 srv.expires = os.time() + item.ttl; | 84 srv.expires = os.time() + item.ttl; |
| 64 end | 85 end |
| 65 if (item.secret == true and default_secret) or type(item.secret) == "string" then | 86 if (item.secret == true and default_secret) or type(item.secret) == "string" then |
| 66 local ttl = default_ttl; | 87 local secret_cb = algorithms[item.algorithm] or algorithms[srv.type]; |
| 67 if type(item.ttl) == "number" then | |
| 68 ttl = item.ttl; | |
| 69 end | |
| 70 local expires = os.time() + ttl; | |
| 71 local secret = item.secret; | 88 local secret = item.secret; |
| 72 if secret == true then | 89 if secret == true then |
| 73 secret = default_secret; | 90 secret = default_secret; |
| 74 end | 91 end |
| 75 local username; | 92 if secret_cb then |
| 76 if type(item.username) == "string" then | 93 secret_cb(srv, item, secret); |
| 77 username = string.format("%d:%s", expires, item.username); | 94 srv.restricted = true; |
| 78 else | |
| 79 username = string.format("%d", expires); | |
| 80 end | 95 end |
| 81 srv.username = username; | |
| 82 srv.password = base64.encode(hashes.hmac_sha1(secret, srv.username)); | |
| 83 srv.restricted = true; | |
| 84 end | 96 end |
| 85 return srv; | 97 return srv; |
| 86 end | 98 end |
| 87 | 99 |
| 88 function module.load() | 100 function module.load() |