From 7d0df9b6ddee8db69ea0a511f031f32a4537a749 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?louiz=E2=80=99?= Date: Thu, 23 Aug 2018 15:21:12 +0200 Subject: Disable the throttle limit if negative Also, invalid values result in -1 being set --- src/database/database.hpp | 4 ++-- src/irc/irc_client.cpp | 2 +- src/irc/irc_client.hpp | 2 +- src/utils/tokens_bucket.hpp | 12 ++++++++---- src/xmpp/biboumi_adhoc_commands.cpp | 6 +++++- 5 files changed, 17 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/database/database.hpp b/src/database/database.hpp index 5fabadd..4a413be 100644 --- a/src/database/database.hpp +++ b/src/database/database.hpp @@ -86,8 +86,8 @@ class Database struct Address: Column { static constexpr auto name = "address_"; }; - struct ThrottleLimit: Column { static constexpr auto name = "throttlelimit_"; - ThrottleLimit(): Column(10) {} }; + struct ThrottleLimit: Column { static constexpr auto name = "throttlelimit_"; + ThrottleLimit(): Column(10) {} }; using MucLogLineTable = Table; using MucLogLine = MucLogLineTable::RowType; diff --git a/src/irc/irc_client.cpp b/src/irc/irc_client.cpp index 78d0fbf..2835a33 100644 --- a/src/irc/irc_client.cpp +++ b/src/irc/irc_client.cpp @@ -1291,7 +1291,7 @@ bool IrcClient::abort_on_invalid_cert() const } #endif -std::size_t IrcClient::get_throttle_limit() const +long int IrcClient::get_throttle_limit() const { #ifdef USE_DATABASE return Database::get_irc_server_options(this->bridge.get_bare_jid(), this->hostname).col(); diff --git a/src/irc/irc_client.hpp b/src/irc/irc_client.hpp index aa314f8..1653225 100644 --- a/src/irc/irc_client.hpp +++ b/src/irc/irc_client.hpp @@ -402,7 +402,7 @@ private: */ Resolver dns_resolver; TokensBucket tokens_bucket; - std::size_t get_throttle_limit() const; + long int get_throttle_limit() const; }; diff --git a/src/utils/tokens_bucket.hpp b/src/utils/tokens_bucket.hpp index 03af015..2992e21 100644 --- a/src/utils/tokens_bucket.hpp +++ b/src/utils/tokens_bucket.hpp @@ -17,7 +17,7 @@ class TokensBucket { public: - TokensBucket(std::size_t max_size, std::chrono::milliseconds fill_duration, std::function callback, std::string name): + TokensBucket(long int max_size, std::chrono::milliseconds fill_duration, std::function callback, std::string name): limit(max_size), tokens(limit), callback(std::move(callback)) @@ -29,6 +29,8 @@ public: bool use_token() { + if (this->limit < 0) + return true; if (this->tokens > 0) { this->tokens--; @@ -38,19 +40,21 @@ public: return false; } - void set_limit(std::size_t limit) + void set_limit(long int limit) { this->limit = limit; } private: - std::size_t limit; + long int limit; std::size_t tokens; std::function callback; void add_token() { - if (this->callback() && this->tokens != limit) + if (this->limit < 0) + return; + if (this->callback() && this->tokens != static_casttokens)>(this->limit)) this->tokens++; } }; diff --git a/src/xmpp/biboumi_adhoc_commands.cpp b/src/xmpp/biboumi_adhoc_commands.cpp index 45557aa..7c31f36 100644 --- a/src/xmpp/biboumi_adhoc_commands.cpp +++ b/src/xmpp/biboumi_adhoc_commands.cpp @@ -494,7 +494,11 @@ void ConfigureIrcServerStep2(XmppComponent& xmpp_component, AdhocSession& sessio else if (field->get_tag("var") == "throttle_limit" && value) { - options.col() = std::stoul(value->get_inner()); + try { + options.col() = std::stol(value->get_inner()); + } catch (const std::logic_error&) { + options.col() = -1; + } Bridge* bridge = biboumi_component.find_user_bridge(session.get_owner_jid()); if (bridge) { -- cgit v1.2.3