diff options
Diffstat (limited to 'src/modules/m_ssl_data.cpp')
-rw-r--r-- | src/modules/m_ssl_data.cpp | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/src/modules/m_ssl_data.cpp b/src/modules/m_ssl_data.cpp new file mode 100644 index 000000000..0ce760971 --- /dev/null +++ b/src/modules/m_ssl_data.cpp @@ -0,0 +1,123 @@ +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2009 InspIRCd Development Team + * See: http://wiki.inspircd.org/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" +#include "transport.h" + +/* $ModDesc: Provides SSL metadata and /WHOIS information */ +class ModuleSSLData : public Module +{ + public: + ModuleSSLData(InspIRCd* Me) : Module(Me) + { + Implementation eventlist[] = { I_OnSyncUserMetaData, I_OnDecodeMetaData, I_OnWhois }; + ServerInstance->Modules->Attach(eventlist, this, 3); + } + + virtual Version GetVersion() + { + return Version("$Id$", VF_VENDOR|VF_COMMON, API_VERSION); + } + + + // :kenny.chatspike.net 320 Om Epy|AFK :is a Secure Connection + virtual void OnWhois(User* source, User* dest) + { + if(dest->GetExt("ssl")) + { + ServerInstance->SendWhoisLine(source, dest, 320, "%s %s :is using a secure connection", source->nick.c_str(), dest->nick.c_str()); + } + } + + virtual void OnSyncUserMetaData(User* user, Module* proto, void* opaque, const std::string &extname, bool displayable) + { + // check if the linking module wants to know about OUR metadata + if (extname == "ssl") + { + // check if this user has an ssl field to send + if (!user->GetExt(extname)) + return; + + // call this function in the linking module, let it format the data how it + // sees fit, and send it on its way. We dont need or want to know how. + proto->ProtoSendMetaData(opaque, TYPE_USER, user, extname, displayable ? "Enabled" : "ON"); + } + else if (extname == "ssl_cert") + { + ssl_cert* cert; + if (!user->GetExt("ssl_cert", cert)) + return; + + std::stringstream value; + bool hasError = cert->GetError().length(); + value << (cert->IsInvalid() ? "v" : "V") << (cert->IsTrusted() ? "T" : "t") << (cert->IsRevoked() ? "R" : "r") + << (cert->IsUnknownSigner() ? "s" : "S") << (hasError ? "E" : "e") << " "; + if (hasError) + value << cert->GetError(); + else + value << cert->GetFingerprint() << " " << cert->GetDN() << " " << cert->GetIssuer(); + + proto->ProtoSendMetaData(opaque, TYPE_USER, user, extname, value.str().c_str()); + } + } + + virtual void OnDecodeMetaData(int target_type, void* target, const std::string &extname, const std::string &extdata) + { + // check if its our metadata key, and its associated with a user + if ((target_type == TYPE_USER) && (extname == "ssl")) + { + User* dest = static_cast<User*>(target); + // if they dont already have an ssl flag, accept the remote server's + if (!dest->GetExt(extname)) + { + dest->Extend(extname); + } + } + else if ((target_type == TYPE_USER) && (extname == "ssl_cert")) + { + User* dest = static_cast<User*>(target); + if (dest->GetExt(extname)) + return; + + ssl_cert* cert = new ssl_cert; + dest->Extend(extname, cert); + + std::stringstream s(extdata); + std::string v; + getline(s,v,' '); + + cert->data.insert(std::make_pair("invalid", ConvToStr(v.find('v') != std::string::npos))); + cert->data.insert(std::make_pair("trusted", ConvToStr(v.find('T') != std::string::npos))); + cert->data.insert(std::make_pair("revoked", ConvToStr(v.find('R') != std::string::npos))); + cert->data.insert(std::make_pair("unknownsigner", ConvToStr(v.find('s') != std::string::npos))); + if (v.find('E') != std::string::npos) + { + getline(s,v,'\n'); + cert->data.insert(std::make_pair("error", v)); + } + else + { + getline(s,v,' '); + cert->data.insert(std::make_pair("fingerprint", v)); + + getline(s,v,' '); + cert->data.insert(std::make_pair("dn", v)); + + getline(s,v,'\n'); + cert->data.insert(std::make_pair("issuer", v)); + } + } + } +}; + +MODULE_INIT(ModuleSSLData) |