authd: fix "is provider done" logic in blacklist/opm providers
This fixes #262.
This commit is contained in:
parent
258eb31c9c
commit
bfd95f010b
3 changed files with 30 additions and 34 deletions
|
@ -193,6 +193,19 @@ is_provider_done(struct auth_client *auth, uint32_t provider)
|
||||||
return get_provider_status(auth, provider) == PROVIDER_STATUS_DONE;
|
return get_provider_status(auth, provider) == PROVIDER_STATUS_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check if provider doesn't exist or has finished on this client */
|
||||||
|
static inline bool
|
||||||
|
run_after_provider(struct auth_client *auth, const char *name)
|
||||||
|
{
|
||||||
|
uint32_t id;
|
||||||
|
|
||||||
|
if (get_provider_id(name, &id)) {
|
||||||
|
return get_provider_status(auth, id) == PROVIDER_STATUS_DONE;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Get provider auth client data */
|
/* Get provider auth client data */
|
||||||
static inline void *
|
static inline void *
|
||||||
get_provider_data(struct auth_client *auth, uint32_t id)
|
get_provider_data(struct auth_client *auth, uint32_t id)
|
||||||
|
|
|
@ -93,6 +93,7 @@ struct blacklist_filter
|
||||||
/* Blacklist user data attached to auth_client instance */
|
/* Blacklist user data attached to auth_client instance */
|
||||||
struct blacklist_user
|
struct blacklist_user
|
||||||
{
|
{
|
||||||
|
bool started;
|
||||||
rb_dlink_list queries; /* Blacklist queries in flight */
|
rb_dlink_list queries; /* Blacklist queries in flight */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -315,7 +316,7 @@ lookup_all_blacklists(struct auth_client *auth)
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
bluser->started = true;
|
||||||
notice_client(auth->cid, "*** Checking your IP against DNS blacklist%s",
|
notice_client(auth->cid, "*** Checking your IP against DNS blacklist%s",
|
||||||
rb_dlink_list_length(&blacklist_list) > 1 ? "s" : "");
|
rb_dlink_list_length(&blacklist_list) > 1 ? "s" : "");
|
||||||
|
|
||||||
|
@ -363,11 +364,9 @@ delete_all_blacklists(void)
|
||||||
static bool
|
static bool
|
||||||
blacklists_start(struct auth_client *auth)
|
blacklists_start(struct auth_client *auth)
|
||||||
{
|
{
|
||||||
uint32_t rdns_pid, ident_pid;
|
|
||||||
|
|
||||||
lrb_assert(get_provider_data(auth, SELF_PID) == NULL);
|
lrb_assert(get_provider_data(auth, SELF_PID) == NULL);
|
||||||
|
|
||||||
if(!rb_dlink_list_length(&blacklist_list)) {
|
if (!rb_dlink_list_length(&blacklist_list)) {
|
||||||
/* Nothing to do... */
|
/* Nothing to do... */
|
||||||
provider_done(auth, SELF_PID);
|
provider_done(auth, SELF_PID);
|
||||||
return true;
|
return true;
|
||||||
|
@ -377,12 +376,9 @@ blacklists_start(struct auth_client *auth)
|
||||||
|
|
||||||
set_provider_data(auth, SELF_PID, rb_malloc(sizeof(struct blacklist_user)));
|
set_provider_data(auth, SELF_PID, rb_malloc(sizeof(struct blacklist_user)));
|
||||||
|
|
||||||
if((!get_provider_id("rdns", &rdns_pid) || is_provider_done(auth, rdns_pid)) &&
|
if (run_after_provider(auth, "rdns") && run_after_provider(auth, "ident")) {
|
||||||
(!get_provider_id("ident", &ident_pid) || is_provider_done(auth, ident_pid)))
|
|
||||||
{
|
|
||||||
/* Start the lookup if ident and rdns are finished, or not loaded. */
|
/* Start the lookup if ident and rdns are finished, or not loaded. */
|
||||||
if(!lookup_all_blacklists(auth))
|
if (!lookup_all_blacklists(auth)) {
|
||||||
{
|
|
||||||
blacklists_cancel_none(auth);
|
blacklists_cancel_none(auth);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -396,26 +392,20 @@ static void
|
||||||
blacklists_initiate(struct auth_client *auth, uint32_t provider)
|
blacklists_initiate(struct auth_client *auth, uint32_t provider)
|
||||||
{
|
{
|
||||||
struct blacklist_user *bluser = get_provider_data(auth, SELF_PID);
|
struct blacklist_user *bluser = get_provider_data(auth, SELF_PID);
|
||||||
uint32_t rdns_pid, ident_pid;
|
|
||||||
|
|
||||||
lrb_assert(provider != SELF_PID);
|
lrb_assert(provider != SELF_PID);
|
||||||
lrb_assert(!is_provider_done(auth, SELF_PID));
|
lrb_assert(!is_provider_done(auth, SELF_PID));
|
||||||
lrb_assert(rb_dlink_list_length(&blacklist_list) > 0);
|
lrb_assert(rb_dlink_list_length(&blacklist_list) > 0);
|
||||||
|
|
||||||
if(bluser == NULL || rb_dlink_list_length(&bluser->queries))
|
if (bluser == NULL || bluser->started) {
|
||||||
/* Nothing to do */
|
/* Nothing to do */
|
||||||
return;
|
return;
|
||||||
else if((!get_provider_id("rdns", &rdns_pid) || is_provider_done(auth, rdns_pid)) &&
|
} else if (run_after_provider(auth, "rdns") && run_after_provider(auth, "ident")) {
|
||||||
(!get_provider_id("ident", &ident_pid) || is_provider_done(auth, ident_pid)))
|
/* Start the lookup if ident and rdns are finished, or not loaded. */
|
||||||
{
|
if (!lookup_all_blacklists(auth)) {
|
||||||
/* Don't start until ident and rdns are finished (or not loaded) */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(!lookup_all_blacklists(auth))
|
|
||||||
blacklists_cancel_none(auth);
|
blacklists_cancel_none(auth);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
|
|
@ -585,31 +585,26 @@ static void
|
||||||
opm_initiate(struct auth_client *auth, uint32_t provider)
|
opm_initiate(struct auth_client *auth, uint32_t provider)
|
||||||
{
|
{
|
||||||
struct opm_lookup *lookup = get_provider_data(auth, SELF_PID);
|
struct opm_lookup *lookup = get_provider_data(auth, SELF_PID);
|
||||||
uint32_t rdns_pid, ident_pid;
|
|
||||||
|
|
||||||
lrb_assert(provider != SELF_PID);
|
lrb_assert(provider != SELF_PID);
|
||||||
lrb_assert(!is_provider_done(auth, SELF_PID));
|
lrb_assert(!is_provider_done(auth, SELF_PID));
|
||||||
lrb_assert(rb_dlink_list_length(&proxy_scanners) > 0);
|
lrb_assert(rb_dlink_list_length(&proxy_scanners) > 0);
|
||||||
|
|
||||||
if(lookup == NULL || lookup->in_progress)
|
if (lookup == NULL || lookup->in_progress) {
|
||||||
/* Nothing to do */
|
/* Nothing to do */
|
||||||
return;
|
return;
|
||||||
else if((!get_provider_id("rdns", &rdns_pid) || is_provider_done(auth, rdns_pid)) &&
|
} else if (run_after_provider(auth, "rdns") && run_after_provider(auth,"ident")) {
|
||||||
(!get_provider_id("ident", &ident_pid) || is_provider_done(auth, ident_pid)))
|
/* Start scanning if ident and rdns are finished, or not loaded. */
|
||||||
/* Don't start until ident and rdns are finished (or not loaded) */
|
|
||||||
return;
|
|
||||||
else
|
|
||||||
opm_scan(auth);
|
opm_scan(auth);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
opm_start(struct auth_client *auth)
|
opm_start(struct auth_client *auth)
|
||||||
{
|
{
|
||||||
uint32_t rdns_pid, ident_pid;
|
|
||||||
|
|
||||||
lrb_assert(get_provider_data(auth, SELF_PID) == NULL);
|
lrb_assert(get_provider_data(auth, SELF_PID) == NULL);
|
||||||
|
|
||||||
if(!opm_enable || rb_dlink_list_length(&proxy_scanners) == 0) {
|
if (!opm_enable || rb_dlink_list_length(&proxy_scanners) == 0) {
|
||||||
/* Nothing to do... */
|
/* Nothing to do... */
|
||||||
provider_done(auth, SELF_PID);
|
provider_done(auth, SELF_PID);
|
||||||
return true;
|
return true;
|
||||||
|
@ -619,10 +614,8 @@ opm_start(struct auth_client *auth)
|
||||||
|
|
||||||
set_provider_data(auth, SELF_PID, rb_malloc(sizeof(struct opm_lookup)));
|
set_provider_data(auth, SELF_PID, rb_malloc(sizeof(struct opm_lookup)));
|
||||||
|
|
||||||
if((!get_provider_id("rdns", &rdns_pid) || is_provider_done(auth, rdns_pid)) &&
|
if (run_after_provider(auth, "rdns") && run_after_provider(auth, "ident")) {
|
||||||
(!get_provider_id("ident", &ident_pid) || is_provider_done(auth, ident_pid)))
|
/* Start scanning if ident and rdns are finished, or not loaded. */
|
||||||
{
|
|
||||||
/* Don't start until ident and rdns are finished (or not loaded) */
|
|
||||||
opm_scan(auth);
|
opm_scan(auth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue