more snotes

This commit is contained in:
Eric Mertens 2025-01-29 20:43:03 -08:00
parent 8d544e31de
commit 0e88f3bd7a
5 changed files with 59 additions and 10 deletions

View File

@ -29,10 +29,9 @@ auto Challenge::on_ircmsg(IrcCommand cmd, const IrcMsg &msg) -> void {
break; break;
case IrcCommand::RPL_YOUREOPER: case IrcCommand::RPL_YOUREOPER:
slot_.disconnect(); slot_.disconnect();
BOOST_LOG_TRIVIAL(error) << "Challenge: Already oper"; connection_.send_ping("mitigation");
break; break;
case IrcCommand::RPL_ENDOFRSACHALLENGE2: case IrcCommand::RPL_ENDOFRSACHALLENGE2:
slot_.disconnect();
finish_challenge(); finish_challenge();
break; break;
} }
@ -81,7 +80,7 @@ auto Challenge::finish_challenge() -> void
mybase64::encode(std::string_view{(char*)digest, digestlen}, buffer_.data() + 1); mybase64::encode(std::string_view{(char*)digest, digestlen}, buffer_.data() + 1);
connection_.send_challenge(buffer_); connection_.send_challenge(buffer_);
connection_.send_ping("oper_up mitigation"); buffer_.clear();
} }
auto Challenge::start(Connection &connection, const std::string_view user, EVP_PKEY_Ref ref) -> std::shared_ptr<Challenge> auto Challenge::start(Connection &connection, const std::string_view user, EVP_PKEY_Ref ref) -> std::shared_ptr<Challenge>

View File

@ -126,7 +126,6 @@ public:
template <typename... Ts> template <typename... Ts>
class Wait class Wait
{ {
// State associated with each wait mode // State associated with each wait mode
std::tuple<Ts...> modes_; std::tuple<Ts...> modes_;

View File

@ -9,6 +9,7 @@
#include <boost/asio.hpp> #include <boost/asio.hpp>
#include <boost/log/trivial.hpp> #include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>
#include <openssl/pem.h> #include <openssl/pem.h>
@ -60,6 +61,9 @@ static auto start(boost::asio::io_context &io, const Settings &settings) -> void
bot->sig_command.connect([connection](const Command &cmd) { bot->sig_command.connect([connection](const Command &cmd) {
std::cout << "COMMAND " << cmd.command << " from " << cmd.account << std::endl; std::cout << "COMMAND " << cmd.command << " from " << cmd.account << std::endl;
if (cmd.oper == "glguy" && cmd.command == "ping") {
connection->send_notice("glguy", cmd.arguments);
}
}); });
connection->start({ connection->start({
@ -87,6 +91,7 @@ static auto get_settings(const char *filename) -> Settings
auto main(int argc, char *argv[]) -> int auto main(int argc, char *argv[]) -> int
{ {
boost::log::core::get()->set_filter(boost::log::trivial::severity >= boost::log::trivial::warning);
if (argc != 2) { if (argc != 2) {
BOOST_LOG_TRIVIAL(error) << "Bad arguments"; BOOST_LOG_TRIVIAL(error) << "Bad arguments";
return 1; return 1;

View File

@ -17,7 +17,7 @@ namespace {
struct SnotePattern struct SnotePattern
{ {
SnotePattern(SnoteTag tag, const char *expression, unsigned flags = 0) SnotePattern(SnoteTag tag, const char *expression)
: tag{tag} : tag{tag}
, expression{expression} , expression{expression}
, regex{expression, std::regex_constants::ECMAScript | std::regex_constants::optimize} , regex{expression, std::regex_constants::ECMAScript | std::regex_constants::optimize}
@ -29,6 +29,8 @@ struct SnotePattern
std::regex regex; std::regex regex;
}; };
using namespace std::literals;
const SnotePattern static patterns[] = { const SnotePattern static patterns[] = {
{SnoteTag::ClientConnecting, {SnoteTag::ClientConnecting,
R"(^Client connecting: ([^ ]+) \(([^@ ]+)@([^) ]+)\) \[(.*)\] \{([^ ]*)\} <([^ ]*)> \[(.*)\]$)"}, R"(^Client connecting: ([^ ]+) \(([^@ ]+)@([^) ]+)\) \[(.*)\] \{([^ ]*)\} <([^ ]*)> \[(.*)\]$)"},
@ -72,23 +74,56 @@ const SnotePattern static patterns[] = {
{SnoteTag::TooManyGlobalConnections, {SnoteTag::TooManyGlobalConnections,
R"(^Too many global connections for ([^ ]+)\[([^ ]+)@([^ ]+)\] \[(.*)\]$)"}, R"(^Too many global connections for ([^ ]+)\[([^ ]+)@([^ ]+)\] \[(.*)\]$)"},
{SnoteTag::TooManyUserConnections,
R"(^Too many user connections for ([^ ]+)\[([^ ]+)@([^ ]+)\] \[(.*)\]$)"},
{SnoteTag::SetVhostOnMarkedAccount, {SnoteTag::SetVhostOnMarkedAccount,
"^\x02([^ ]+)\x02 set vhost ([^ ]+) on the \x02MARKED\x02 account ([^ ]+).$"}, "^\x02([^ ]+)\x02 set vhost ([^ ]+) on the \x02MARKED\x02 account ([^ ]+).$"},
{SnoteTag::IsNowOper, {SnoteTag::IsNowOper,
R"(^([^ ]+) \(([^ ]+)!([^ ]+)@([^ ]+)\) is now an operator$)"}, R"(^([^ ]+) \(([^ ]+)!([^ ]+)@([^ ]+)\) is now an operator$)"},
{SnoteTag::NickCollision,
R"(^Nick collision due to services forced nick change on ([^ ]+)$)"},
{SnoteTag::OperspyWhois, {SnoteTag::OperspyWhois,
R"(^OPERSPY ([^ ]+)!([^ ]+)@([^ ]+)\{([^ ]+)\} WHOIS ([^ ]+)!([^ ]+)@([^ ]+) ([^ ]+)$)"}, R"(^OPERSPY ([^ ]+)!([^ ]+)@([^ ]+)\{([^ ]+)\} WHOIS ([^ ]+)!([^ ]+)@([^ ]+) ([^ ]+)$)"},
{SnoteTag::Freeze, {SnoteTag::Freeze,
R"(^([^ ]+) froze the account ([^ ]+) \((.*)\)\.$)"}, "^\x02([^ ]+)\x02 froze the account \x02([^ ]+)\x02 \\((.*)\\)\\.$"},
{SnoteTag::DroppedChannel,
"^\x02([^ ]+)\x02 dropped the channel \x02([^ ]+)\x02$"},
{SnoteTag::Spambot, {SnoteTag::Spambot,
R"(User ([^ ]+) \(([^ ]+)@([^ ]+)\) trying to join ([^ ]+) is a possible spambot)"}, R"(^User ([^ ]+) \(([^ ]+)@([^ ]+)\) trying to join ([^ ]+) is a possible spambot$)"},
{SnoteTag::SaveMessage,
R"(^Received SAVE message for ([^ ]+) from ([^ ]+)$)"},
{SnoteTag::NickCollisionServices,
R"(^Nick collision due to services forced nick change on ([^ ]+)$)"},
{SnoteTag::NickCollision,
R"(^Nick collision on ([^ ]+)\(([^ ]+) <- ([^ ]+)\)\(([^ ]+) <- ([^ ]+)\)\(([^ ]+)\)$)"},
{SnoteTag::TemporaryDline,
R"(^([^ ]+) added temporary ([^ ]+) min\. D-Line for \[([^ ]+)\] \[(.*)\]$)"},
{SnoteTag::FailedChallengeMissingSecure,
R"(^Failed CHALLENGE attempt - missing secure connection by ([^ ]+) \(([^ ]+)@([^ ]+)\)$)"},
{SnoteTag::FailedChallenge,
R"(^Failed CHALLENGE attempt by ([^ ]+) \(([^ ]+)@([^ ]+)\)$)"},
{SnoteTag::FailedChallengeHostMismatch,
R"(^Failed CHALLENGE attempt - host mismatch by ([^ ]+) \(([^ ]+)@([^ ]+)\)$)"},
{SnoteTag::FailedChallengeNoBlock,
R"(^Failed CHALLENGE attempt - user@host mismatch or no operator block for ([^ ]+) by ([^ ]+) \(([^ ]+)@([^ ]+)\)$)"},
{SnoteTag::FailedChallengeTls,
R"(^Failed CHALLENGE attempt - missing SSL/TLS by ([^ ]+) \(([^ ]+)@([^ ]+)\)$)"},
{SnoteTag::FailedChallengeFingerprintMismatch,
R"(^Failed CHALLENGE attempt - client certificate fingerprint mismatch by ([^ ]+) \(([^ ]+)@([^ ]+)\)$)"}
}; };
static auto setup_database() -> hs_database_t * static auto setup_database() -> hs_database_t *

View File

@ -28,12 +28,23 @@ enum class SnoteTag
PossibleFlooder, PossibleFlooder,
Killed, Killed,
TooManyGlobalConnections, TooManyGlobalConnections,
TooManyUserConnections,
SetVhostOnMarkedAccount, SetVhostOnMarkedAccount,
IsNowOper, IsNowOper,
NickCollision, NickCollision,
OperspyWhois, OperspyWhois,
Freeze, Freeze,
Spambot, Spambot,
FailedChallenge,
FailedChallengeHostMismatch,
FailedChallengeNoBlock,
FailedChallengeTls,
FailedChallengeFingerprintMismatch,
FailedChallengeMissingSecure,
SaveMessage,
NickCollisionServices,
DroppedChannel,
TemporaryDline
}; };
class SnoteMatch class SnoteMatch