diff --git a/data/modules.example.conf b/data/modules.example.conf index e3cd7ad22..b645693cb 100644 --- a/data/modules.example.conf +++ b/data/modules.example.conf @@ -805,6 +805,16 @@ module /* Web service to use. Requires httpd. */ server = "httpd/main" + + /* + * Whether to enable the use of XML-RPC extensions. + * + * By default Anope will use some extended XML-RPC types. If your XML-RPC + * client can not handle these you will need to disable them. + * + * If nil is disabled an empty struct will be used instead. + */ + #enable_nil = no } /* diff --git a/modules/extra/xmlrpc.cpp b/modules/extra/xmlrpc.cpp index ac720f66f..a4afaa9a3 100644 --- a/modules/extra/xmlrpc.cpp +++ b/modules/extra/xmlrpc.cpp @@ -63,6 +63,9 @@ private: } public: + // Whether we should use the nil XML-RPC extension. + static bool enable_nil; + MyXMLRPCServiceInterface(Module *creator, const Anope::string &sname) : RPC::ServiceInterface(creator, sname) , HTTPPage("/xmlrpc", "text/xml") @@ -178,8 +181,10 @@ public: xmlrpc_value *value; if (request.GetRoot()) value = SerializeElement(env, request.GetRoot().value()); - else + else if (enable_nil) value = xmlrpc_nil_new(&env); + else + value = xmlrpc_struct_new(&env); auto *response = xmlrpc_mem_block_new(&env, 0); xmlrpc_serialize_response(&env, response, value); @@ -212,7 +217,7 @@ xmlrpc_value *MyXMLRPCServiceInterface::SerializeElement(xmlrpc_env &env, const }, [&env, &elem](std::nullptr_t) { - elem = xmlrpc_nil_new(&env); + elem = enable_nil ? xmlrpc_nil_new(&env) : xmlrpc_struct_new(&env); }, [&env, &elem](bool b) { @@ -245,6 +250,8 @@ xmlrpc_value *MyXMLRPCServiceInterface::SerializeElement(xmlrpc_env &env, const return elem; } +bool MyXMLRPCServiceInterface::enable_nil = true; + class ModuleXMLRPC final : public Module { @@ -285,11 +292,14 @@ public: if (httpref) httpref->UnregisterPage(&xmlrpcinterface); - this->httpref = ServiceReference("HTTPProvider", conf.GetModule(this).Get("server", "httpd/main")); + auto &modconf = conf.GetModule(this); + MyXMLRPCServiceInterface::enable_nil = modconf.Get("enable_nil", "yes"); + + this->httpref = ServiceReference("HTTPProvider", modconf.Get("server", "httpd/main")); if (!httpref) throw ConfigException("Unable to find http reference, is httpd loaded?"); - httpref->RegisterPage(&xmlrpcinterface); + } };