summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSadie Powell <sadie@witchery.services>2025-03-10 11:49:34 +0000
committerSadie Powell <sadie@witchery.services>2025-03-10 12:48:13 +0000
commitea0d5c4d70990108c00275818e767f0158dab655 (patch)
tree93f0f19a78c3e20a4716f5eca3a1a76b69a0b819
parentb96dbfc9ba4f9c1072a773813210f8c72c49af15 (diff)
Add a config option for disabling the nil XML-RPC extension.
-rw-r--r--data/modules.example.conf10
-rw-r--r--modules/extra/xmlrpc.cpp18
2 files changed, 24 insertions, 4 deletions
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>("HTTPProvider", conf.GetModule(this).Get<const Anope::string>("server", "httpd/main"));
+ auto &modconf = conf.GetModule(this);
+ MyXMLRPCServiceInterface::enable_nil = modconf.Get<bool>("enable_nil", "yes");
+
+ this->httpref = ServiceReference<HTTPProvider>("HTTPProvider", modconf.Get<const Anope::string>("server", "httpd/main"));
if (!httpref)
throw ConfigException("Unable to find http reference, is httpd loaded?");
-
httpref->RegisterPage(&xmlrpcinterface);
+
}
};