Cockatrice 2026-10-19-Development-3.1.2-beta.2
A virtual tabletop for multiplayer card games
Loading...
Searching...
No Matches
ratelimiter.h
Go to the documentation of this file.
1#ifndef RATELIMITER_H
2#define RATELIMITER_H
3
4#include <QList>
5#include <QMap>
6#include <QMutex>
7#include <QString>
8
11{
12public:
24 bool recordAttempt(const QString &key, int maxAttempts, int windowSeconds);
25
32 bool recordAttemptAt(const QString &key, int maxAttempts, int windowSeconds, qint64 now);
33
40 bool isBlocked(const QString &key, int maxAttempts, int windowSeconds) const;
41
48 bool isBlockedAt(const QString &key, int maxAttempts, int windowSeconds, qint64 now) const;
49
51 void clearAttempts(const QString &key);
52
63 int retryAfterSeconds(const QString &key, int maxAttempts, int windowSeconds) const;
64
70 int retryAfterSecondsAt(const QString &key, int maxAttempts, int windowSeconds, qint64 now) const;
71
72private:
74 {
75 QList<qint64> timestamps; // epoch seconds, oldest first
77 };
78
85 void pruneLocked(qint64 now);
86
87 mutable QMutex mutex;
88 QMap<QString, AttemptHistory> attempts; // key -> attempt history
89 qint64 lastPruneSecs = 0;
90 static constexpr int PruneIntervalSeconds = 60;
91};
92
93#endif
Definition remote_connection_controller.h:20
Definition game.h:18
Thread-safe per-key attempt limiter used to throttle abusive requests.
Definition ratelimiter.h:11
qint64 lastPruneSecs
Definition ratelimiter.h:89
static constexpr int PruneIntervalSeconds
Definition ratelimiter.h:90
void pruneLocked(qint64 now)
Drops keys whose last attempts have fully aged out of their window.
Definition ratelimiter.cpp:106
bool recordAttemptAt(const QString &key, int maxAttempts, int windowSeconds, qint64 now)
Record an attempt as seen at epoch second now.
Definition ratelimiter.cpp:10
bool isBlockedAt(const QString &key, int maxAttempts, int windowSeconds, qint64 now) const
Whether key is blocked as measured at epoch second now.
Definition ratelimiter.cpp:41
QMutex mutex
Definition ratelimiter.h:87
QMap< QString, AttemptHistory > attempts
Definition ratelimiter.h:88
bool isBlocked(const QString &key, int maxAttempts, int windowSeconds) const
True if key already has at least maxAttempts attempts within windowSeconds.
Definition ratelimiter.cpp:36
void clearAttempts(const QString &key)
Drop all recorded attempts for the key, e.g. after a successful login.
Definition ratelimiter.cpp:63
int retryAfterSecondsAt(const QString &key, int maxAttempts, int windowSeconds, qint64 now) const
Get the retry-after window in seconds for key as measured at now.
Definition ratelimiter.cpp:74
int retryAfterSeconds(const QString &key, int maxAttempts, int windowSeconds) const
Get the retry-after window in seconds for key.
Definition ratelimiter.cpp:69
bool recordAttempt(const QString &key, int maxAttempts, int windowSeconds)
Record an attempt for key and report whether the key is now blocked.
Definition ratelimiter.cpp:5
Definition ratelimiter.h:74
QList< qint64 > timestamps
Definition ratelimiter.h:75
int windowSeconds
Definition ratelimiter.h:76