auth-penalty.c revision e76073ebaf90fa29abfdc364873acf78983949aa
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomi/* Copyright (c) 2009 Dovecot authors, see the included COPYING file */
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomistruct auth_penalty *auth_penalty_init(const char *path)
a7ad754fca008f60d348f4296e5831e31ce8cc71Timo Sirainen penalty->client = anvil_client_init(path, NULL,
a7ad754fca008f60d348f4296e5831e31ce8cc71Timo Sirainen if (anvil_client_connect(penalty->client, TRUE) < 0)
a7ad754fca008f60d348f4296e5831e31ce8cc71Timo Sirainen anvil_client_cmd(penalty->client, t_strdup_printf(
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomi "PENALTY-SET-EXPIRE-SECS\t%u", AUTH_PENALTY_TIMEOUT));
a62dad9ec88bb112079dd95be456d258c6c86369Timo Sirainenvoid auth_penalty_deinit(struct auth_penalty **_penalty)
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomiunsigned int auth_penalty_to_secs(unsigned int penalty)
a7ad754fca008f60d348f4296e5831e31ce8cc71Timo Sirainen unsigned int i, secs = AUTH_PENALTY_INIT_SECS;
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomi for (i = 0; i < penalty; i++)
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomi return secs < AUTH_PENALTY_MAX_SECS ? secs : AUTH_PENALTY_MAX_SECS;
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomistatic void auth_penalty_anvil_callback(const char *reply, void *context)
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomi unsigned int penalty = 0;
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomi unsigned long last_update = 0;
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomi /* internal failure */
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomi } else if (sscanf(reply, "%u %lu", &penalty, &last_update) != 2) {
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomi /* time moved backwards? */
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomi /* update penalty. */
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomi while (penalty > 0) {
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomi request->callback(penalty, request->auth_request);
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomivoid auth_penalty_lookup(struct auth_penalty *penalty,
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomi const char *ident;
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomivoid auth_penalty_update(struct auth_penalty *penalty,
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomi struct auth_request *auth_request, unsigned int value)
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomi const char *ident;
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomi /* even if the actual value doesn't change, the last_change
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomi timestamp does. */
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomi const char *cmd =
316cbe323513a0f20d1cf519fe9405e231d633e2Aki Tuomi t_strdup_printf("PENALTY-SET\t%s\t%u", ident, value);