*/
#include "inspircd.h"
-
#include <gnutls/gnutls.h>
#include <gnutls/x509.h>
-
-#include "inspircd_config.h"
-#include "configreader.h"
-#include "users.h"
-#include "channels.h"
-#include "modules.h"
-#include "socket.h"
-#include "hashcomp.h"
#include "transport.h"
#include "m_cap.h"
CmdResult Handle (const std::vector<std::string> ¶meters, User *user)
{
- if (user->registered == REG_ALL)
+ /* changed from == REG_ALL to catch clients sending STARTTLS
+ * after NICK and USER but before OnUserConnect completes and
+ * give a proper error message (see bug #645) - dz
+ */
+ if (user->registered != REG_NONE)
{
- ServerInstance->Users->QuitUser(user, "STARTTLS not allowed after client registration");
+ ServerInstance->Users->QuitUser(user, "STARTTLS is not permitted after client registration has started");
}
else
{
Caller->OnRawSocketAccept(user->GetFd(), user->GetIPString(), user->GetPort());
}
else
- user->WriteNumeric(671, "%s :STARTTLS failure", user->nick.c_str());
+ user->WriteNumeric(691, "%s :STARTTLS failure", user->nick.c_str());
}
return CMD_FAILURE;
if((ret = gnutls_certificate_set_x509_key_file (x509_cred, certfile.c_str(), keyfile.c_str(), GNUTLS_X509_FMT_PEM)) < 0)
{
// If this fails, no SSL port will work. At all. So, do the smart thing - throw a ModuleException
- throw ModuleException("Unable to load GnuTLS server certificate: " + std::string(gnutls_strerror(ret)));
+ throw ModuleException("Unable to load GnuTLS server certificate (" + std::string(certfile) + ", key: " + keyfile + "): " + std::string(gnutls_strerror(ret)));
}
// This may be on a large (once a day or week) timer eventually.
}
else
{
+ ServerInstance->Logs->Log("m_ssl_gnutls", DEFAULT,
+ "m_ssl_gnutls.so: Error while reading on fd %d: %s",
+ session->fd, gnutls_strerror(ret));
readresult = 0;
CloseSession(session);
}
{
if(ret != GNUTLS_E_AGAIN && ret != GNUTLS_E_INTERRUPTED)
{
+ ServerInstance->Logs->Log("m_ssl_gnutls", DEFAULT,
+ "m_ssl_gnutls.so: Error while writing to fd %d: %s",
+ session->fd, gnutls_strerror(ret));
CloseSession(session);
}
else
else
{
// Handshake failed.
+ ServerInstance->Logs->Log("m_ssl_gnutls", DEFAULT,
+ "m_ssl_gnutls.so: Handshake failed on fd %d: %s",
+ session->fd, gnutls_strerror(ret));
CloseSession(session);
session->status = ISSL_CLOSING;
}
/* Beware here we do not check for errors.
*/
- if ((gnutls_x509_crt_get_expiration_time(cert) < time(0)) || (gnutls_x509_crt_get_activation_time(cert) > time(0)))
+ if ((gnutls_x509_crt_get_expiration_time(cert) < ServerInstance->Time()) || (gnutls_x509_crt_get_activation_time(cert) > ServerInstance->Time()))
{
certinfo->data.insert(std::make_pair("error","Not activated, or expired certificate"));
}