diff options
| author | Adam <Adam@anope.org> | 2012-11-01 13:32:38 -0400 |
|---|---|---|
| committer | Adam <Adam@anope.org> | 2012-11-01 14:47:23 -0400 |
| commit | 90930619bc124e94bac5048c0b13c3f4748b559d (patch) | |
| tree | cbe2325f6295aa188a6dd0f0d56d336eab060bbe /modules | |
| parent | 5b1c8230191fa626ef9210c5035f14a8df4c0ed6 (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.cpp | 15 | ||||
| -rw-r--r-- | modules/extra/m_ssl.cpp | 18 | ||||
| -rw-r--r-- | modules/extra/webcpanel/pages/chanserv/access.cpp | 2 | ||||
| -rw-r--r-- | modules/extra/webcpanel/pages/chanserv/akick.cpp | 2 | ||||
| -rw-r--r-- | modules/extra/webcpanel/pages/chanserv/set.cpp | 2 | ||||
| -rw-r--r-- | modules/extra/webcpanel/pages/index.cpp | 2 | ||||
| -rw-r--r-- | modules/extra/webcpanel/pages/logout.cpp | 2 | ||||
| -rw-r--r-- | modules/extra/webcpanel/webcpanel.cpp | 2 | ||||
| -rw-r--r-- | modules/extra/webcpanel/webcpanel.h | 1 |
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 { |
