#include <string.h>
#include <syslog.h>
#include "passwdutil.h"
int
__incr_failed_count(const char *username, char *repname, int max_failures)
{
int ret;
void *buf;
attrlist items[1];
int repnum = name_to_int(repname);
repops_t *ops;
if ((repnum != REP_FILES) &&
(repnum != REP_LDAP)) {
return (PWU_SUCCESS);
}
ops = rops[repnum];
if ((ops->lock != NULL) &&
(ret = ops->lock()) != PWU_SUCCESS) {
return (ret);
}
items[0].type = ATTR_INCR_FAILED_LOGINS;
items[0].next = NULL;
if ((ret = ops->getpwnam(username, items, NULL, &buf)) != PWU_SUCCESS) {
goto out;
}
if ((ret = ops->update(items, NULL, buf)) != PWU_SUCCESS) {
goto out;
}
if (items[0].data.val_i >= max_failures) {
syslog(LOG_AUTH|LOG_NOTICE,
"Excessive (%d) login failures for %s: locking account.",
max_failures, username);
items[0].type = ATTR_LOCK_ACCOUNT;
if ((ret = ops->update(items, NULL, buf)) != PWU_SUCCESS)
goto out;
}
if (((ret = ops->putpwnam(username, NULL, NULL, buf)) ==
PWU_SUCCESS) &&
(items[0].type == ATTR_LOCK_ACCOUNT))
ret = PWU_ACCOUNT_LOCKED;
out:
if (ops->unlock != NULL) {
ops->unlock();
}
return (ret);
}
int
__rst_failed_count(const char *username, char *repname)
{
int ret;
void *buf;
attrlist items[1];
int repnum = name_to_int(repname);
repops_t *ops;
if ((repnum != REP_FILES) &&
(repnum != REP_LDAP)) {
return (PWU_SUCCESS);
}
ops = rops[repnum];
if ((ops->lock != NULL) &&
(ret = ops->lock()) != PWU_SUCCESS) {
return (ret);
}
items[0].type = ATTR_RST_FAILED_LOGINS;
items[0].next = NULL;
if ((ret = ops->getpwnam(username, items, NULL, &buf)) != PWU_SUCCESS)
goto out;
if ((ret = ops->update(items, NULL, buf)) != PWU_SUCCESS)
goto out;
ret = ops->putpwnam(username, NULL, NULL, buf);
out:
if (ops->unlock != NULL) {
ops->unlock();
}
return (ret != PWU_SUCCESS ? ret : items[0].data.val_i);
}