comparison mod_external_services/mod_external_services.lua @ 4667:1990611691cf

mod_external_services: Factor out public function returning current services This way you get the _prepared_ services and don't have to do that mapping yourself.
author Kim Alvefur <zash@zash.se>
date Mon, 30 Aug 2021 00:11:58 +0200
parents dbc7ba3cc27c
children ede9682c2022
comparison
equal deleted inserted replaced
4666:dbc7ba3cc27c 4667:1990611691cf
113 __newindex = function (self, i, v) 113 __newindex = function (self, i, v)
114 rawset(self, i, assert(prepare(v), "Invalid service entry added")); 114 rawset(self, i, assert(prepare(v), "Invalid service entry added"));
115 end; 115 end;
116 } 116 }
117 117
118 function get_services()
119 local extras = module:get_host_items("external_service");
120 local services = ( configured_services + extras ) / prepare;
121
122 setmetatable(services, services_mt);
123
124 return services;
125 end
126
118 local function handle_services(event) 127 local function handle_services(event)
119 local origin, stanza = event.origin, event.stanza; 128 local origin, stanza = event.origin, event.stanza;
120 local action = stanza.tags[1]; 129 local action = stanza.tags[1];
121 130
122 local user_bare = jid.bare(stanza.attr.from); 131 local user_bare = jid.bare(stanza.attr.from);
125 origin.send(st.error_reply(stanza, "auth", "forbidden")); 134 origin.send(st.error_reply(stanza, "auth", "forbidden"));
126 return true; 135 return true;
127 end 136 end
128 137
129 local reply = st.reply(stanza):tag("services", { xmlns = action.attr.xmlns }); 138 local reply = st.reply(stanza):tag("services", { xmlns = action.attr.xmlns });
130 local extras = module:get_host_items("external_service"); 139 local services = get_services();
131 local services = ( configured_services + extras ) / prepare;
132 140
133 local requested_type = action.attr.type; 141 local requested_type = action.attr.type;
134 if requested_type then 142 if requested_type then
135 services:filter(function(item) 143 services:filter(function(item)
136 return item.type == requested_type; 144 return item.type == requested_type;
137 end); 145 end);
138 end 146 end
139
140 setmetatable(services, services_mt);
141 147
142 module:fire_event("external_service/services", { 148 module:fire_event("external_service/services", {
143 origin = origin; 149 origin = origin;
144 stanza = stanza; 150 stanza = stanza;
145 reply = reply; 151 reply = reply;
172 origin.send(st.error_reply(stanza, "auth", "forbidden", "The 'port' and 'type' attributes are required.")); 178 origin.send(st.error_reply(stanza, "auth", "forbidden", "The 'port' and 'type' attributes are required."));
173 return true; 179 return true;
174 end 180 end
175 181
176 local reply = st.reply(stanza):tag("credentials", { xmlns = action.attr.xmlns }); 182 local reply = st.reply(stanza):tag("credentials", { xmlns = action.attr.xmlns });
177 local extras = module:get_host_items("external_service"); 183 local services = get_services();
178 local services = ( configured_services + extras ) / prepare;
179 services:filter(function (item) 184 services:filter(function (item)
180 return item.restricted; 185 return item.restricted;
181 end) 186 end)
182 187
183 local requested_credentials = set.new(); 188 local requested_credentials = set.new();
188 end 193 end
189 194
190 requested_credentials:add(string.format("%s:%s:%d", service.attr.type, service.attr.host, 195 requested_credentials:add(string.format("%s:%s:%d", service.attr.type, service.attr.host,
191 tonumber(service.attr.port) or 0)); 196 tonumber(service.attr.port) or 0));
192 end 197 end
193
194 setmetatable(services, services_mt);
195 198
196 module:fire_event("external_service/credentials", { 199 module:fire_event("external_service/credentials", {
197 origin = origin; 200 origin = origin;
198 stanza = stanza; 201 stanza = stanza;
199 reply = reply; 202 reply = reply;