-/* +------------------------------------+\r * | Inspire Internet Relay Chat Daemon |\r * +------------------------------------+\r *\r * InspIRCd: (C) 2002-2007 InspIRCd Development Team\r * See: http://www.inspircd.org/wiki/index.php/Credits\r *\r * This program is free but copyrighted software; see\r * the file COPYING for details.\r *\r * ---------------------------------------------------\r */\r\r#ifndef __TRANSPORT_H__\r#define __TRANSPORT_H__\r\r#include <map>\r#include <string>\r\r/** A generic container for certificate data\r */\rtypedef std::map<std::string,std::string> ssl_data;\r\r/** A shorthand way of representing an iterator into ssl_data\r */\rtypedef ssl_data::iterator ssl_data_iter;\r\r/** ssl_cert is a class which abstracts SSL certificate\r * and key information.\r *\r * Because gnutls and openssl represent key information in\r * wildly different ways, this class allows it to be accessed\r * in a unified manner. These classes are attached to ssl-\r * connected local users using Extensible::Extend() and the\r * key 'ssl_cert'.\r */\rclass ssl_cert\r{\r /** Always contains an empty string\r */\r const std::string empty;\r\r public:\r /** The data for this certificate\r */\r ssl_data data;\r\r /** Default constructor, initializes 'empty'\r */\r ssl_cert() : empty("")\r {\r }\r \r /** Get certificate distinguished name\r * @return Certificate DN\r */\r const std::string& GetDN()\r {\r ssl_data_iter ssldi = data.find("dn");\r\r if (ssldi != data.end())\r return ssldi->second;\r else\r return empty;\r }\r\r /** Get Certificate issuer\r * @return Certificate issuer\r */\r const std::string& GetIssuer()\r {\r ssl_data_iter ssldi = data.find("issuer");\r\r if (ssldi != data.end())\r return ssldi->second;\r else\r return empty;\r }\r\r /** Get error string if an error has occured\r * @return The error associated with this users certificate,\r * or an empty string if there is no error.\r */\r const std::string& GetError()\r {\r ssl_data_iter ssldi = data.find("error");\r\r if (ssldi != data.end())\r return ssldi->second;\r else\r return empty;\r }\r\r /** Get key fingerprint.\r * @return The key fingerprint as a hex string.\r */\r const std::string& GetFingerprint()\r {\r ssl_data_iter ssldi = data.find("fingerprint");\r\r if (ssldi != data.end())\r return ssldi->second;\r else\r return empty;\r }\r\r /** Get trust status\r * @return True if this is a trusted certificate\r * (the certificate chain validates)\r */\r bool IsTrusted()\r {\r ssl_data_iter ssldi = data.find("trusted");\r\r if (ssldi != data.end())\r return (ssldi->second == "1");\r else\r return false;\r }\r\r /** Get validity status\r * @return True if the certificate itself is\r * correctly formed.\r */\r bool IsInvalid()\r {\r ssl_data_iter ssldi = data.find("invalid");\r\r if (ssldi != data.end())\r return (ssldi->second == "1");\r else\r return false;\r }\r\r /** Get signer status\r * @return True if the certificate appears to be\r * self-signed.\r */\r bool IsUnknownSigner()\r {\r ssl_data_iter ssldi = data.find("unknownsigner");\r\r if (ssldi != data.end())\r return (ssldi->second == "1");\r else\r return false;\r }\r\r /** Get revokation status.\r * @return True if the certificate is revoked.\r * Note that this only works properly for GnuTLS\r * right now.\r */\r bool IsRevoked()\r {\r ssl_data_iter ssldi = data.find("revoked");\r\r if (ssldi != data.end())\r return (ssldi->second == "1");\r else\r return false;\r }\r};\r\r/** Used to represent a request to a transport provider module\r */\rclass ISHRequest : public Request\r{\r public:\r InspSocket* Sock;\r\r ISHRequest(Module* Me, Module* Target, const char* rtype, InspSocket* sock) : Request(Me, Target, rtype), Sock(sock)\r {\r }\r};\r\r/** Used to represent a request to attach a cert to an InspSocket\r */\rclass InspSocketAttachCertRequest : public ISHRequest\r{\r public:\r /** Initialize the request as an attach cert message */\r InspSocketAttachCertRequest(InspSocket* is, Module* Me, Module* Target) : ISHRequest(Me, Target, "IS_ATTACH", is)\r {\r }\r};\r\r/** Used to check if a handshake is complete on an InspSocket yet\r */\rclass InspSocketHSCompleteRequest : public ISHRequest\r{\r public:\r /** Initialize the request as a 'handshake complete?' message */\r InspSocketHSCompleteRequest(InspSocket* is, Module* Me, Module* Target) : ISHRequest(Me, Target, "IS_HSDONE", is)\r {\r }\r};\r\r/** Used to hook a transport provider to an InspSocket\r */\rclass InspSocketHookRequest : public ISHRequest\r{\r public:\r /** Initialize request as a hook message */\r InspSocketHookRequest(InspSocket* is, Module* Me, Module* Target) : ISHRequest(Me, Target, "IS_HOOK", is)\r {\r }\r};\r\r/** Used to unhook a transport provider from an InspSocket\r */\rclass InspSocketUnhookRequest : public ISHRequest\r{\r public:\r /** Initialize request as an unhook message */\r InspSocketUnhookRequest(InspSocket* is, Module* Me, Module* Target) : ISHRequest(Me, Target, "IS_UNHOOK", is)\r {\r }\r};\r\rclass InspSocketNameRequest : public ISHRequest\r{\r public:\r /** Initialize request as a get name message */\r InspSocketNameRequest(Module* Me, Module* Target) : ISHRequest(Me, Target, "IS_NAME", NULL)\r {\r }\r};\r\r#endif\r\r
\ No newline at end of file
+/* +------------------------------------+
+ * | Inspire Internet Relay Chat Daemon |
+ * +------------------------------------+
+ *
+ * InspIRCd: (C) 2002-2009 InspIRCd Development Team
+ * See: http://www.inspircd.org/wiki/index.php/Credits
+ *
+ * This program is free but copyrighted software; see
+ * the file COPYING for details.
+ *
+ * ---------------------------------------------------
+ */
+
+#ifndef __TRANSPORT_H__
+#define __TRANSPORT_H__
+
+#include <map>
+#include <string>
+
+/** A generic container for certificate data
+ */
+typedef std::map<std::string,std::string> ssl_data;
+
+/** A shorthand way of representing an iterator into ssl_data
+ */
+typedef ssl_data::iterator ssl_data_iter;
+
+/** ssl_cert is a class which abstracts SSL certificate
+ * and key information.
+ *
+ * Because gnutls and openssl represent key information in
+ * wildly different ways, this class allows it to be accessed
+ * in a unified manner. These classes are attached to ssl-
+ * connected local users using Extensible::Extend() and the
+ * key 'ssl_cert'.
+ */
+class ssl_cert : public Extensible
+{
+ /** Always contains an empty string
+ */
+ const std::string empty;
+
+ public:
+ /** The data for this certificate
+ */
+ ssl_data data;
+
+ /** Default constructor, initializes 'empty'
+ */
+ ssl_cert() : empty("")
+ {
+ }
+
+ /** Get certificate distinguished name
+ * @return Certificate DN
+ */
+ const std::string& GetDN()
+ {
+ ssl_data_iter ssldi = data.find("dn");
+
+ if (ssldi != data.end())
+ return ssldi->second;
+ else
+ return empty;
+ }
+
+ /** Get Certificate issuer
+ * @return Certificate issuer
+ */
+ const std::string& GetIssuer()
+ {
+ ssl_data_iter ssldi = data.find("issuer");
+
+ if (ssldi != data.end())
+ return ssldi->second;
+ else
+ return empty;
+ }
+
+ /** Get error string if an error has occured
+ * @return The error associated with this users certificate,
+ * or an empty string if there is no error.
+ */
+ const std::string& GetError()
+ {
+ ssl_data_iter ssldi = data.find("error");
+
+ if (ssldi != data.end())
+ return ssldi->second;
+ else
+ return empty;
+ }
+
+ /** Get key fingerprint.
+ * @return The key fingerprint as a hex string.
+ */
+ const std::string& GetFingerprint()
+ {
+ ssl_data_iter ssldi = data.find("fingerprint");
+
+ if (ssldi != data.end())
+ return ssldi->second;
+ else
+ return empty;
+ }
+
+ /** Get trust status
+ * @return True if this is a trusted certificate
+ * (the certificate chain validates)
+ */
+ bool IsTrusted()
+ {
+ ssl_data_iter ssldi = data.find("trusted");
+
+ if (ssldi != data.end())
+ return (ssldi->second == "1");
+ else
+ return false;
+ }
+
+ /** Get validity status
+ * @return True if the certificate itself is
+ * correctly formed.
+ */
+ bool IsInvalid()
+ {
+ ssl_data_iter ssldi = data.find("invalid");
+
+ if (ssldi != data.end())
+ return (ssldi->second == "1");
+ else
+ return false;
+ }
+
+ /** Get signer status
+ * @return True if the certificate appears to be
+ * self-signed.
+ */
+ bool IsUnknownSigner()
+ {
+ ssl_data_iter ssldi = data.find("unknownsigner");
+
+ if (ssldi != data.end())
+ return (ssldi->second == "1");
+ else
+ return false;
+ }
+
+ /** Get revokation status.
+ * @return True if the certificate is revoked.
+ * Note that this only works properly for GnuTLS
+ * right now.
+ */
+ bool IsRevoked()
+ {
+ ssl_data_iter ssldi = data.find("revoked");
+
+ if (ssldi != data.end())
+ return (ssldi->second == "1");
+ else
+ return false;
+ }
+};
+
+/** Used to represent a request to a transport provider module
+ */
+class ISHRequest : public Request
+{
+ public:
+ BufferedSocket* Sock;
+
+ ISHRequest(Module* Me, Module* Target, const char* rtype, BufferedSocket* sock) : Request(Me, Target, rtype), Sock(sock)
+ {
+ }
+};
+
+/** Used to represent a request to attach a cert to an BufferedSocket
+ */
+class BufferedSocketAttachCertRequest : public ISHRequest
+{
+ public:
+ /** Initialize the request as an attach cert message */
+ BufferedSocketAttachCertRequest(BufferedSocket* is, Module* Me, Module* Target) : ISHRequest(Me, Target, "IS_ATTACH", is)
+ {
+ }
+};
+
+/** Used to check if a handshake is complete on an BufferedSocket yet
+ */
+class BufferedSocketHSCompleteRequest : public ISHRequest
+{
+ public:
+ /** Initialize the request as a 'handshake complete?' message */
+ BufferedSocketHSCompleteRequest(BufferedSocket* is, Module* Me, Module* Target) : ISHRequest(Me, Target, "IS_HSDONE", is)
+ {
+ }
+};
+
+/** Used to hook a transport provider to an BufferedSocket
+ */
+class BufferedSocketHookRequest : public ISHRequest
+{
+ public:
+ /** Initialize request as a hook message */
+ BufferedSocketHookRequest(BufferedSocket* is, Module* Me, Module* Target) : ISHRequest(Me, Target, "IS_HOOK", is)
+ {
+ }
+};
+
+/** Used to unhook a transport provider from an BufferedSocket
+ */
+class BufferedSocketUnhookRequest : public ISHRequest
+{
+ public:
+ /** Initialize request as an unhook message */
+ BufferedSocketUnhookRequest(BufferedSocket* is, Module* Me, Module* Target) : ISHRequest(Me, Target, "IS_UNHOOK", is)
+ {
+ }
+};
+
+class BufferedSocketNameRequest : public ISHRequest
+{
+ public:
+ /** Initialize request as a get name message */
+ BufferedSocketNameRequest(Module* Me, Module* Target) : ISHRequest(Me, Target, "IS_NAME", NULL)
+ {
+ }
+};
+
+#endif
+