summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2012-11-01 13:32:38 -0400
committerAdam <Adam@anope.org>2012-11-01 14:47:23 -0400
commit90930619bc124e94bac5048c0b13c3f4748b559d (patch)
treecbe2325f6295aa188a6dd0f0d56d336eab060bbe /modules
parent5b1c8230191fa626ef9210c5035f14a8df4c0ed6 (diff)
Fixed quite a bit of dumbness with m_ssl. Had to
modify socketengines to allow polling for write & no read, but is it cleaner now. Made m_httpd able to listen using SSL.
Diffstat (limited to 'modules')
-rw-r--r--modules/extra/m_httpd.cpp15
-rw-r--r--modules/extra/m_ssl.cpp18
-rw-r--r--modules/extra/webcpanel/pages/chanserv/access.cpp2
-rw-r--r--modules/extra/webcpanel/pages/chanserv/akick.cpp2
-rw-r--r--modules/extra/webcpanel/pages/chanserv/set.cpp2
-rw-r--r--modules/extra/webcpanel/pages/index.cpp2
-rw-r--r--modules/extra/webcpanel/pages/logout.cpp2
-rw-r--r--modules/extra/webcpanel/webcpanel.cpp2
-rw-r--r--modules/extra/webcpanel/webcpanel.h1
9 files changed, 37 insertions, 9 deletions
diff --git a/modules/extra/m_httpd.cpp b/modules/extra/m_httpd.cpp
index 357e9fba9..4453cf826 100644
--- a/modules/extra/m_httpd.cpp
+++ b/modules/extra/m_httpd.cpp
@@ -7,6 +7,7 @@
#include "module.h"
#include "httpd.h"
+#include "ssl.h"
static Anope::string BuildDate()
{
@@ -299,9 +300,10 @@ class MyHTTPProvider : public HTTPProvider, public CallBack
class HTTPD : public Module
{
+ service_reference<SSLService> sslref;
std::map<Anope::string, HTTPProvider *> providers;
public:
- HTTPD(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, SUPPORTED)
+ HTTPD(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, SUPPORTED), sslref("SSLService", "ssl")
{
this->SetAuthor("Anope");
@@ -338,6 +340,7 @@ class HTTPD : public Module
Anope::string ip = config.ReadValue("httpd", "ip", "", i);
int port = config.ReadInteger("httpd", "port", "8080", i, true);
int timeout = config.ReadInteger("httpd", "timeout", "30", i, true);
+ bool ssl = config.ReadFlag("httpd", "ssl", "no", i);
Anope::string ext_ip = config.ReadValue("httpd", "extforward_ip", "", i);
Anope::string ext_header = config.ReadValue("httpd", "extforward_header", "", i);
@@ -352,12 +355,20 @@ class HTTPD : public Module
continue;
}
+ if (ssl && !sslref)
+ {
+ Log(this) << "Could not enable SSL, is m_ssl loaded?";
+ ssl = false;
+ }
+
HTTPProvider *p;
if (this->providers.count(hname) == 0)
{
try
{
p = new MyHTTPProvider(this, hname, ip, port, timeout);
+ if (ssl)
+ sslref->Init(p);
}
catch (const SocketException &ex)
{
@@ -380,6 +391,8 @@ class HTTPD : public Module
try
{
p = new MyHTTPProvider(this, hname, ip, port, timeout);
+ if (ssl)
+ sslref->Init(p);
}
catch (const SocketException &ex)
{
diff --git a/modules/extra/m_ssl.cpp b/modules/extra/m_ssl.cpp
index adae7a6fe..2f72744c7 100644
--- a/modules/extra/m_ssl.cpp
+++ b/modules/extra/m_ssl.cpp
@@ -153,6 +153,10 @@ class SSLModule : public Module
SSL_CTX_set_verify(client_ctx, SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE, SSLModule::AlwaysAccept);
SSL_CTX_set_verify(server_ctx, SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE, SSLModule::AlwaysAccept);
+ Anope::string context_name = "Anope";
+ SSL_CTX_set_session_id_context(client_ctx, reinterpret_cast<const unsigned char *>(context_name.c_str()), context_name.length());
+ SSL_CTX_set_session_id_context(server_ctx, reinterpret_cast<const unsigned char *>(context_name.c_str()), context_name.length());
+
ModuleManager::Attach(I_OnReload, this);
ModuleManager::Attach(I_OnPreServerConnect, this);
}
@@ -275,7 +279,8 @@ SocketFlag SSLSocketIO::FinishAccept(ClientSocket *cs)
int error = SSL_get_error(IO->sslsock, ret);
if (ret == -1 && (error == SSL_ERROR_WANT_READ || error == SSL_ERROR_WANT_WRITE))
{
- SocketEngine::MarkWritable(cs);
+ SocketEngine::Change(cs, error == SSL_ERROR_WANT_WRITE, SF_WRITABLE);
+ SocketEngine::Change(cs, error == SSL_ERROR_WANT_READ, SF_READABLE);
return SF_ACCEPTING;
}
else
@@ -290,6 +295,8 @@ SocketFlag SSLSocketIO::FinishAccept(ClientSocket *cs)
{
cs->SetFlag(SF_ACCEPTED);
cs->UnsetFlag(SF_ACCEPTING);
+ SocketEngine::Change(cs, false, SF_WRITABLE);
+ SocketEngine::Change(cs, true, SF_READABLE);
cs->OnAccept();
return SF_ACCEPTED;
}
@@ -315,7 +322,7 @@ void SSLSocketIO::Connect(ConnectionSocket *s, const Anope::string &target, int
}
else
{
- SocketEngine::MarkWritable(s);
+ SocketEngine::Change(s, true, SF_WRITABLE);
s->SetFlag(SF_CONNECTING);
return;
}
@@ -354,7 +361,8 @@ SocketFlag SSLSocketIO::FinishConnect(ConnectionSocket *s)
int error = SSL_get_error(IO->sslsock, ret);
if (ret == -1 && (error == SSL_ERROR_WANT_READ || error == SSL_ERROR_WANT_WRITE))
{
- SocketEngine::MarkWritable(s);
+ SocketEngine::Change(s, error == SSL_ERROR_WANT_WRITE, SF_WRITABLE);
+ SocketEngine::Change(s, error == SSL_ERROR_WANT_READ, SF_READABLE);
return SF_CONNECTING;
}
else
@@ -369,6 +377,8 @@ SocketFlag SSLSocketIO::FinishConnect(ConnectionSocket *s)
{
s->UnsetFlag(SF_CONNECTING);
s->SetFlag(SF_CONNECTED);
+ SocketEngine::Change(s, false, SF_WRITABLE);
+ SocketEngine::Change(s, true, SF_READABLE);
s->OnConnect();
return SF_CONNECTED;
}
@@ -381,6 +391,8 @@ void SSLSocketIO::Destroy()
SSL_shutdown(this->sslsock);
SSL_free(this->sslsock);
}
+
+ delete this;
}
MODULE_INIT(SSLModule)
diff --git a/modules/extra/webcpanel/pages/chanserv/access.cpp b/modules/extra/webcpanel/pages/chanserv/access.cpp
index dc999c350..a1b8be97f 100644
--- a/modules/extra/webcpanel/pages/chanserv/access.cpp
+++ b/modules/extra/webcpanel/pages/chanserv/access.cpp
@@ -18,7 +18,7 @@ bool WebCPanel::ChanServ::Access::OnRequest(HTTPProvider *server, const Anope::s
if (chname.empty())
{
reply.error = HTTP_FOUND;
- reply.headers["Location"] = "http://" + message.headers["Host"] + "/chanserv/info";
+ reply.headers["Location"] = Anope::string("http") + (use_ssl ? "s" : "") + "://" + message.headers["Host"] + "/chanserv/info";
return true;
}
diff --git a/modules/extra/webcpanel/pages/chanserv/akick.cpp b/modules/extra/webcpanel/pages/chanserv/akick.cpp
index 70fa5b52e..d5351bfd9 100644
--- a/modules/extra/webcpanel/pages/chanserv/akick.cpp
+++ b/modules/extra/webcpanel/pages/chanserv/akick.cpp
@@ -18,7 +18,7 @@ bool WebCPanel::ChanServ::Akick::OnRequest(HTTPProvider *server, const Anope::st
if (chname.empty())
{
reply.error = HTTP_FOUND;
- reply.headers["Location"] = "http://" + message.headers["Host"] + "/chanserv/info";
+ reply.headers["Location"] = Anope::string("http") + (use_ssl ? "s" : "") + "://" + message.headers["Host"] + "/chanserv/info";
return true;
}
diff --git a/modules/extra/webcpanel/pages/chanserv/set.cpp b/modules/extra/webcpanel/pages/chanserv/set.cpp
index 889e8f24f..4ad551e6a 100644
--- a/modules/extra/webcpanel/pages/chanserv/set.cpp
+++ b/modules/extra/webcpanel/pages/chanserv/set.cpp
@@ -18,7 +18,7 @@ bool WebCPanel::ChanServ::Set::OnRequest(HTTPProvider *server, const Anope::stri
if (chname.empty())
{
reply.error = HTTP_FOUND;
- reply.headers["Location"] = "http://" + message.headers["Host"] + "/chanserv/info";
+ reply.headers["Location"] = Anope::string("http") + (use_ssl ? "s" : "") + "://" + message.headers["Host"] + "/chanserv/info";
return true;
}
diff --git a/modules/extra/webcpanel/pages/index.cpp b/modules/extra/webcpanel/pages/index.cpp
index 357d3ec3b..c97737c21 100644
--- a/modules/extra/webcpanel/pages/index.cpp
+++ b/modules/extra/webcpanel/pages/index.cpp
@@ -58,7 +58,7 @@ class WebpanelRequest : public IdentifyRequest
}
reply.error = HTTP_FOUND;
- reply.headers["Location"] = "http://" + message.headers["Host"] + "/nickserv/info";
+ reply.headers["Location"] = Anope::string("http") + (use_ssl ? "s" : "") + "://" + message.headers["Host"] + "/nickserv/info";
client->SendReply(&reply);
}
diff --git a/modules/extra/webcpanel/pages/logout.cpp b/modules/extra/webcpanel/pages/logout.cpp
index efa93ab4f..d62bde95f 100644
--- a/modules/extra/webcpanel/pages/logout.cpp
+++ b/modules/extra/webcpanel/pages/logout.cpp
@@ -17,7 +17,7 @@ bool WebCPanel::Logout::OnRequest(HTTPProvider *server, const Anope::string &pag
na->Shrink("webcpanel_ip");
reply.error = HTTP_FOUND;
- reply.headers["Location"] = "http://" + message.headers["Host"];
+ reply.headers["Location"] = Anope::string("http") + (use_ssl ? "s" : "") + "://" + message.headers["Host"];
return true;
}
diff --git a/modules/extra/webcpanel/webcpanel.cpp b/modules/extra/webcpanel/webcpanel.cpp
index c23b6efbf..77cf606aa 100644
--- a/modules/extra/webcpanel/webcpanel.cpp
+++ b/modules/extra/webcpanel/webcpanel.cpp
@@ -9,6 +9,7 @@
Module *me;
Anope::string provider_name, template_name, template_base, page_title;
+bool use_ssl = false;
class ModuleWebCPanel : public Module
{
@@ -53,6 +54,7 @@ class ModuleWebCPanel : public Module
template_name = reader.ReadValue("webcpanel", "template", "template", 0);
template_base = db_dir + "/modules/webcpanel/templates/" + template_name;
page_title = reader.ReadValue("webcpanel", "title", "Anope IRC Services", 0);
+ use_ssl = reader.ReadFlag("webcpanel", "ssl", "no", 0); // This is dumb, is there a better way to do this?
service_reference<HTTPProvider> provider("HTTPProvider", provider_name);
if (!provider)
diff --git a/modules/extra/webcpanel/webcpanel.h b/modules/extra/webcpanel/webcpanel.h
index 926feaf53..99cb2ec3a 100644
--- a/modules/extra/webcpanel/webcpanel.h
+++ b/modules/extra/webcpanel/webcpanel.h
@@ -14,6 +14,7 @@
extern Module *me;
extern Anope::string provider_name, template_name, template_base, page_title;
+extern bool use_ssl;
struct SubSection
{