summaryrefslogtreecommitdiff
path: root/modules/m_xmlrpc.cpp
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2015-10-27 18:57:37 -0400
committerAdam <Adam@anope.org>2015-10-27 18:58:48 -0400
commit64dac60071fab652745a6e7a06cf6b7bdbbd3625 (patch)
treef8f30161150451672b381f6370a8fdcab654bbb8 /modules/m_xmlrpc.cpp
parent162fdbe5815bbdf187f549fefac94ff476d72e62 (diff)
parent830361e97d03c74e54cb1cf1bbf329dffdeb66f7 (diff)
Merge branch '2.0' into 2.1
Diffstat (limited to 'modules/m_xmlrpc.cpp')
-rw-r--r--modules/m_xmlrpc.cpp50
1 files changed, 42 insertions, 8 deletions
diff --git a/modules/m_xmlrpc.cpp b/modules/m_xmlrpc.cpp
index 3830b2ac8..2d1cd2c0e 100644
--- a/modules/m_xmlrpc.cpp
+++ b/modules/m_xmlrpc.cpp
@@ -53,6 +53,39 @@ class MyXMLRPCServiceInterface : public XMLRPCServiceInterface, public HTTPPage
return ret;
}
+ static Anope::string Unescape(const Anope::string &string)
+ {
+ Anope::string ret = string;
+ for (int i = 0; special[i].character.empty() == false; ++i)
+ if (!special[i].replace.empty())
+ ret = ret.replace_all_cs(special[i].replace, special[i].character);
+
+ for (size_t i, last = 0; (i = string.find("&#", last)) != Anope::string::npos;)
+ {
+ last = i + 1;
+
+ size_t end = string.find(';', i);
+ if (end == Anope::string::npos)
+ break;
+
+ Anope::string ch = string.substr(i + 2, end - (i + 2));
+
+ if (ch.empty())
+ continue;
+
+ long l;
+ if (!ch.empty() && ch[0] == 'x')
+ l = strtol(ch.substr(1).c_str(), NULL, 16);
+ else
+ l = strtol(ch.c_str(), NULL, 10);
+
+ if (l > 0 && l < 256)
+ ret = ret.replace_all_cs("&#" + ch + ";", Anope::string(l));
+ }
+
+ return ret;
+ }
+
private:
static bool GetData(Anope::string &content, Anope::string &tag, Anope::string &data)
{
@@ -98,8 +131,8 @@ class MyXMLRPCServiceInterface : public XMLRPCServiceInterface, public HTTPPage
}
while (istag && !content.empty());
- tag = prev;
- data = cur;
+ tag = Unescape(prev);
+ data = Unescape(cur);
return !istag && !data.empty();
}
@@ -146,10 +179,10 @@ class MyXMLRPCServiceInterface : public XMLRPCServiceInterface, public HTTPPage
if (!request.id.empty())
request.reply("id", request.id);
- Anope::string r = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<methodCall>\n<methodName>" + request.name + "</methodName>\n<params>\n<param>\n<value>\n<struct>\n";
+ Anope::string r = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<methodResponse>\n<params>\n<param>\n<value>\n<struct>\n";
for (std::map<Anope::string, Anope::string>::const_iterator it = request.get_replies().begin(); it != request.get_replies().end(); ++it)
r += "<member>\n<name>" + it->first + "</name>\n<value>\n<string>" + this->Sanitize(it->second) + "</string>\n</value>\n</member>\n";
- r += "</struct>\n</value>\n</param>\n</params>\n</methodCall>";
+ r += "</struct>\n</value>\n</param>\n</params>\n</methodResponse>";
request.r.Write(r);
}
@@ -162,12 +195,8 @@ class ModuleXMLRPC : public Module
MyXMLRPCServiceInterface xmlrpcinterface;
ModuleXMLRPC(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, EXTRA | VENDOR)
- , httpref("HTTPProvider", "httpd/main")
, xmlrpcinterface(this, "xmlrpc")
{
- if (!httpref)
- throw ModuleException("Unable to find http reference, is m_httpd loaded?");
- httpref->RegisterPage(&xmlrpcinterface);
}
@@ -179,7 +208,12 @@ class ModuleXMLRPC : public Module
void OnReload(Configuration::Conf *conf) override
{
+ if (httpref)
+ httpref->UnregisterPage(&xmlrpcinterface);
this->httpref = ServiceReference<HTTPProvider>("HTTPProvider", conf->GetModule(this)->Get<Anope::string>("server", "httpd/main"));
+ if (!httpref)
+ throw ConfigException("Unable to find http reference, is m_httpd loaded?");
+ httpref->RegisterPage(&xmlrpcinterface);
}
};