Mercurial > thymian
diff server/flood_check.h @ 0:a4671277546c tip
created the repository for the thymian project
| author | ferencd |
|---|---|
| date | Tue, 17 Aug 2021 11:19:54 +0200 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/flood_check.h Tue Aug 17 11:19:54 2021 +0200 @@ -0,0 +1,51 @@ +#ifndef FLOOD_CHECK +#define FLOOD_CHECK + +#include <string> +#include <map> +#include <chrono> +#include <mutex> + +/** + * @brief The flood_check class will check if there is a flood attempt from some specific + * IP. The following is the method: If it can identify that in a given second a given IP + * has tried more than 100 (configurable) requests it will reject the requests without + * going further. + */ +class flood_check +{ +public: + + static void attempt(std::string ip); + +private: + + static std::mutex locker; + + // holds the flood attempts and when they have first occured + struct count_started + { + int count = 0; + std::time_t first_time = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch()).count(); + }; + + // structures used to determine the flood rate / second + using flood_map = std::map<std::string, int>; + static std::map<std::time_t, flood_map> floods; + + // holds the flood attempts of a host. For each IP we have an attempt counter + // how many times it tried to flood us and when the last attempt happened + static std::map<std::string, count_started> hostd_flood; + + // holds the evil hosts that are flooding the system and how long they are locked out + // the content of this map is determined based on the content of the hostd_flood + // map. If a count from there reaches over 10 and the first_time of the + // entry is < 1 minute then we consider the host flooding us. + static std::map<std::string, std::time_t> rejected_hosts; + + // holds how many times the given host was suspended. Each suspension will give another minute to the host + static std::map<std::string, int> suspension_times; +}; + +#endif // FLOOD_CHECK +
