portmanager: add logic to allow specification of service default values for ssl confi...
authorMarco Cirillo <maranda@lightwitch.org>
Thu, 4 Apr 2013 23:36:30 +0000 (23:36 +0000)
committerMarco Cirillo <maranda@lightwitch.org>
Thu, 4 Apr 2013 23:36:30 +0000 (23:36 +0000)
core/portmanager.lua

index 68c7617a14ecaa82a4f47a6f14f3517b279ba36f..1b3740cf91f444e1172c3ebd32a230d99f8245bd 100644 (file)
@@ -70,6 +70,16 @@ prosody.events.add_handler("item-removed/net-provider", function (event)
        unregister_service(item.name, item);
 end);
 
+local function duplicate_ssl_config(ssl_config)
+       local ssl_config = type(ssl_config) == "table" and ssl_config or {};
+
+       local _config = {};
+       for k, v in pairs(ssl_config) do
+               _config[k] = v;
+       end
+       return _config;
+end
+
 --- Public API
 
 function activate(service_name)
@@ -114,9 +124,24 @@ function activate(service_name)
                                local err;
                                -- Create SSL context for this service/port
                                if service_info.encryption == "ssl" then
-                                       local ssl_config = config.get("*", config_prefix.."ssl");
-                                       ssl, err = certmanager.create_context(service_info.name.." port "..port, "server", ssl_config and (ssl_config[port_number]
-                                               or (ssl_config.certificate and ssl_config)));
+                                       local ssl_config = duplicate_ssl_config((config.get("*", config_prefix.."ssl") and config.get("*", config_prefix.."ssl")[interface])
+                                                               or (config.get("*", config_prefix.."ssl") and config.get("*", config_prefix.."ssl")[port])
+                                                               or config.get("*", config_prefix.."ssl")
+                                                               or (config.get("*", "ssl") and config.get("*", "ssl")[interface])
+                                                               or (config.get("*", "ssl") and config.get("*", "ssl")[port])
+                                                               or config.get("*", "ssl"));
+                                       -- add default entries for, or override ssl configuration
+                                       if ssl_config and service_info.ssl_config then
+                                               for key, value in pairs(service_info.ssl_config) do
+                                                       if not service_info.ssl_config_override and not ssl_config[key] then
+                                                               ssl_config[key] = value;
+                                                       elseif service_info.ssl_config_override then
+                                                               ssl_config[key] = value;
+                                                       end
+                                               end
+                                       end
+
+                                       ssl, err = certmanager.create_context(service_info.name.." port "..port, "server", ssl_config);
                                        if not ssl then
                                                log("error", "Error binding encrypted port for %s: %s", service_info.name, error_to_friendly_message(service_name, port_number, err) or "unknown error");
                                        end