MXS-1346: Fix the at_times rule
The rule used the values from the QuerySpeed struct instead of the values in the rule itself.
This commit is contained in:
@ -136,25 +136,17 @@ typedef struct timerange_t
|
|||||||
*/
|
*/
|
||||||
struct QuerySpeed
|
struct QuerySpeed
|
||||||
{
|
{
|
||||||
QuerySpeed(int period = 0, int cooldown = 0, int limit = 0):
|
QuerySpeed():
|
||||||
first_query(0),
|
first_query(0),
|
||||||
triggered(0),
|
triggered(0),
|
||||||
period(period),
|
|
||||||
cooldown(cooldown),
|
|
||||||
count(0),
|
count(0),
|
||||||
limit(limit),
|
|
||||||
id(0),
|
|
||||||
active(false)
|
active(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
time_t first_query; /*< Time when the first query occurred */
|
time_t first_query; /*< Time when the first query occurred */
|
||||||
time_t triggered; /*< Time when the limit was exceeded */
|
time_t triggered; /*< Time when the limit was exceeded */
|
||||||
int period; /*< Measurement interval in seconds */
|
|
||||||
int cooldown; /*< Time the user is denied access for */
|
|
||||||
int count; /*< Number of queries done */
|
int count; /*< Number of queries done */
|
||||||
int limit; /*< Maximum number of queries */
|
|
||||||
long id; /*< Unique id of the rule */
|
|
||||||
bool active; /*< If the rule has been triggered */
|
bool active; /*< If the rule has been triggered */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -288,9 +288,9 @@ bool LimitQueriesRule::matches_query(DbfwSession* session, GWBUF* buffer, char**
|
|||||||
|
|
||||||
if (queryspeed->active)
|
if (queryspeed->active)
|
||||||
{
|
{
|
||||||
if (difftime(time_now, queryspeed->triggered) < queryspeed->cooldown)
|
if (difftime(time_now, queryspeed->triggered) < m_holdoff)
|
||||||
{
|
{
|
||||||
double blocked_for = queryspeed->cooldown - difftime(time_now, queryspeed->triggered);
|
double blocked_for = m_holdoff - difftime(time_now, queryspeed->triggered);
|
||||||
*msg = create_error("Queries denied for %f seconds", blocked_for);
|
*msg = create_error("Queries denied for %f seconds", blocked_for);
|
||||||
matches = true;
|
matches = true;
|
||||||
|
|
||||||
@ -305,28 +305,32 @@ bool LimitQueriesRule::matches_query(DbfwSession* session, GWBUF* buffer, char**
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (queryspeed->count >= queryspeed->limit)
|
if (queryspeed->count >= m_max)
|
||||||
{
|
{
|
||||||
MXS_INFO("rule '%s': query limit triggered (%d queries in %d seconds), "
|
MXS_INFO("rule '%s': query limit triggered (%d queries in %d seconds), "
|
||||||
"denying queries from user for %d seconds.", name().c_str(),
|
"denying queries from user for %d seconds.", name().c_str(),
|
||||||
queryspeed->limit, queryspeed->period, queryspeed->cooldown);
|
m_max, m_timeperiod, m_holdoff);
|
||||||
|
|
||||||
queryspeed->triggered = time_now;
|
queryspeed->triggered = time_now;
|
||||||
queryspeed->active = true;
|
queryspeed->active = true;
|
||||||
matches = true;
|
matches = true;
|
||||||
|
|
||||||
double blocked_for = queryspeed->cooldown - difftime(time_now, queryspeed->triggered);
|
double blocked_for = m_holdoff - difftime(time_now, queryspeed->triggered);
|
||||||
*msg = create_error("Queries denied for %f seconds", blocked_for);
|
*msg = create_error("Queries denied for %f seconds", blocked_for);
|
||||||
}
|
}
|
||||||
else if (queryspeed->count > 0 &&
|
else if (queryspeed->count == 0)
|
||||||
difftime(time_now, queryspeed->first_query) <= queryspeed->period)
|
{
|
||||||
|
queryspeed->first_query = time_now;
|
||||||
|
queryspeed->count = 1;
|
||||||
|
}
|
||||||
|
else if (difftime(time_now, queryspeed->first_query) <= m_timeperiod)
|
||||||
{
|
{
|
||||||
queryspeed->count++;
|
queryspeed->count++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
queryspeed->first_query = time_now;
|
/** The time period was exceeded, reset the query count */
|
||||||
queryspeed->count = 1;
|
queryspeed->count = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user