diff options
Diffstat (limited to 'modules/protocol')
| -rw-r--r-- | modules/protocol/inspircd12.cpp | 26 | ||||
| -rw-r--r-- | modules/protocol/inspircd20.cpp | 26 | ||||
| -rw-r--r-- | modules/protocol/plexus.cpp | 42 |
3 files changed, 93 insertions, 1 deletions
diff --git a/modules/protocol/inspircd12.cpp b/modules/protocol/inspircd12.cpp index cedab07bf..62df416b1 100644 --- a/modules/protocol/inspircd12.cpp +++ b/modules/protocol/inspircd12.cpp @@ -302,6 +302,13 @@ bool event_chghost(const Anope::string &source, const std::vector<Anope::string> return true; } + +/* + * source = numeric of the sending server + * params[0] = uuid + * params[1] = metadata name + * params[2] = data + */ bool event_metadata(const Anope::string &source, const std::vector<Anope::string> ¶ms) { if (params.size() < 3) @@ -316,6 +323,25 @@ bool event_metadata(const Anope::string &source, const std::vector<Anope::string } } +/* + * possible incoming ssl_cert messages: + * Received: :409 METADATA 409AAAAAA ssl_cert :vTrSe c38070ce96e41cc144ed6590a68d45a6 <...> <...> + * Received: :409 METADATA 409AAAAAC ssl_cert :vTrSE Could not get peer certificate: error:00000000:lib(0):func(0):reason(0) + */ + if (params[1].equals_cs("ssl_cert")) + { + User *u = finduser(params[0]); + if (!u) + return true; + std::string data = params[2].c_str(); + size_t pos1 = data.find(' ') + 1; + size_t pos2 = data.find(' ', pos1); + if (u && ((pos2 - pos1) == 32)) // fingerprints should always be 32 bytes in size + { + u->fingerprint = data.substr(pos1, pos2 - pos1); + FOREACH_MOD(I_OnFingerprint, OnFingerprint(u)); + } + } return true; } diff --git a/modules/protocol/inspircd20.cpp b/modules/protocol/inspircd20.cpp index bd020891d..20e622092 100644 --- a/modules/protocol/inspircd20.cpp +++ b/modules/protocol/inspircd20.cpp @@ -317,6 +317,13 @@ bool event_chghost(const Anope::string &source, const std::vector<Anope::string> return true; } + +/* + * source = numeric of the sending server + * params[0] = uuid + * params[1] = metadata name + * params[2] = data + */ bool event_metadata(const Anope::string &source, const std::vector<Anope::string> ¶ms) { if (params.size() < 3) @@ -331,6 +338,25 @@ bool event_metadata(const Anope::string &source, const std::vector<Anope::string } } +/* + * possible incoming ssl_cert messages: + * Received: :409 METADATA 409AAAAAA ssl_cert :vTrSe c38070ce96e41cc144ed6590a68d45a6 <...> <...> + * Received: :409 METADATA 409AAAAAC ssl_cert :vTrSE Could not get peer certificate: error:00000000:lib(0):func(0):reason(0) + */ + if (params[1].equals_cs("ssl_cert")) + { + User *u = finduser(params[0]); + if (!u) + return true; + std::string data = params[2].c_str(); + size_t pos1 = data.find(' ') + 1; + size_t pos2 = data.find(' ', pos1); + if ((pos2 - pos1) == 32) // fingerprints should always be 32 bytes in size + { + u->fingerprint = data.substr(pos1, pos2 - pos1); + FOREACH_MOD(I_OnFingerprint, OnFingerprint(u)); + } + } return true; } diff --git a/modules/protocol/plexus.cpp b/modules/protocol/plexus.cpp index 797f2f09c..1d9a911ce 100644 --- a/modules/protocol/plexus.cpp +++ b/modules/protocol/plexus.cpp @@ -554,6 +554,46 @@ bool event_bmask(const Anope::string &source, const std::vector<Anope::string> & return true; } +bool event_encap(const Anope::string &sourcd, const std::vector<Anope::string> ¶ms) +{ + if (params.size() < 4) + return true; +/* + * Received: :dev.anope.de ENCAP * SU DukePyrolator DukePyrolator + * params[0] = * + * params[1] = SU + * params[2] = nickname + * params[3] = account + */ + if (params[1].equals_cs("SU")) + { + User *u = finduser(params[2]); + NickCore *nc = findcore(params[3]); + if (u && nc) + { + u->Login(nc); + } + } +/* + * Received: :dev.anope.de ENCAP * CERTFP DukePyrolator :3F122A9CC7811DBAD3566BF2CEC3009007C0868F + * params[0] = * + * params[1] = CERTFP + * params[2] = nickname + * params[3] = fingerprint + */ + if (params[1].equals_cs("CERTFP")) + { + User *u = finduser(params[2]); + if (u) + { + u->fingerprint = params[3]; + FOREACH_MOD(I_OnFingerprint, OnFingerprint(u)); + } + } + return true; +} + + static void AddModes() { /* Add user modes */ @@ -617,7 +657,7 @@ class ProtoPlexus : public Module ProtoPlexus(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator), message_tmode("TMODE", event_tmode), message_bmask("BMASK", event_bmask), message_pass("PASS", event_pass), message_tb("TB", event_tburst), - message_sid("SID", event_sid) + message_sid("SID", event_sid), message_encap("ENCAP", event_encap); { this->SetAuthor("Anope"); this->SetType(PROTOCOL); |
