Mercurial > masqmail
diff src/route.c @ 317:55b7bde95d37
reworked allowed and denied addrs for routes
The following refactorings had been made:
- allowed_mail_locals + allowed_return_paths -> allowed_senders
- not_allowed_mail_locals + not_allowed_return_paths -> denied_senders
- allowed_rcpt_domains -> allowed_recipients
- not_allowed_rcpt_domains -> denied_recipients
The new options allow more consistent and more flexible matching.
author | meillo@marmaro.de |
---|---|
date | Thu, 28 Apr 2011 09:55:06 +0200 |
parents | 87df0aa99cc7 |
children | 257ffce6c1cd |
line wrap: on
line diff
--- a/src/route.c Mon Apr 25 15:17:30 2011 +0200 +++ b/src/route.c Thu Apr 28 09:55:06 2011 +0200 @@ -238,21 +238,34 @@ } static gint -_g_list_addrcmp(gconstpointer a, gconstpointer b) +_g_list_addrcmp(gconstpointer pattern, gconstpointer addr) { - return addr_match((address *) a, (address *) b); + int res; + address* patternaddr = (address*) pattern; + address* stringaddr = (address*) addr; + + DEBUG(6) debugf("_g_list_addrcmp: pattern `%s' `%s' on string `%s' `%s'\n", + patternaddr->local_part, patternaddr->domain, + stringaddr->local_part, stringaddr->domain); + /* TODO: check if we should match here dependent on caseless_matching */ + res = fnmatch(patternaddr->local_part, stringaddr->local_part, 0); + if (res != 0) { + DEBUG(6) debugf("_g_list_addrcmp: ... failed on local_part\n"); + return res; + } + res = fnmatch(patternaddr->domain, stringaddr->domain, FNM_CASEFOLD); + DEBUG(6) debugf("_g_list_addrcmp: ... %s\n", (res==0) ? "matched" : "failed on domain"); + return res; } gboolean -route_is_allowed_return_path(connect_route * route, address * ret_path) +route_sender_is_allowed(connect_route * route, address * ret_path) { - if (route->not_allowed_return_paths != NULL) { - if (g_list_find_custom(route->not_allowed_return_paths, ret_path, _g_list_addrcmp) != NULL) { - return FALSE; - } + if (route->denied_senders && g_list_find_custom(route->denied_senders, ret_path, _g_list_addrcmp)) { + return FALSE; } - if (route->allowed_return_paths != NULL) { - if (g_list_find_custom(route->allowed_return_paths, ret_path, _g_list_addrcmp) != NULL) { + if (route->allowed_senders) { + if (g_list_find_custom(route->allowed_senders, ret_path, _g_list_addrcmp)) { return TRUE; } else { return FALSE; @@ -261,49 +274,25 @@ return TRUE; } -static gint -_g_list_strcmp(gconstpointer a, gconstpointer b) -{ - return (gint) strcmp(a, b); -} - -gboolean -route_is_allowed_mail_local(connect_route * route, address * ret_path) -{ - gchar *loc_part = ret_path->local_part; - - if (route->not_allowed_mail_locals != NULL) { - if (g_list_find_custom(route->not_allowed_mail_locals, loc_part, _g_list_strcmp) != NULL) - return FALSE; - } - if (route->allowed_mail_locals != NULL) { - if (g_list_find_custom(route->allowed_mail_locals, loc_part, _g_list_strcmp) != NULL) - return TRUE; - else - return FALSE; - } - return TRUE; -} - /* Make lists of matching/not matching rcpts. Local domains are NOT regared here, these should be sorted out previously */ void -msg_rcptlist_route(connect_route * route, GList * rcpt_list, GList ** p_rcpt_list, GList ** p_non_rcpt_list) +route_split_rcpts(connect_route * route, GList * rcpt_list, GList ** p_rcpt_list, GList ** p_non_rcpt_list) { GList *tmp_list = NULL; /* sort out those domains that can be sent over this connection: */ - if (route->allowed_rcpt_domains) { - DEBUG(5) debugf("testing for route->allowed_rcpt_domains\n"); - split_rcpts(rcpt_list, route->allowed_rcpt_domains, NULL, &tmp_list, p_non_rcpt_list); + if (route->allowed_recipients) { + DEBUG(5) debugf("testing for route->allowed_recipients\n"); + split_rcpts(rcpt_list, route->allowed_recipients, NULL, &tmp_list, p_non_rcpt_list); } else { - DEBUG(5) debugf("route->allowed_rcpt_domains == NULL\n"); + DEBUG(5) debugf("route->allowed_recipients == NULL\n"); tmp_list = g_list_copy(rcpt_list); } /* sort out those domains that cannot be sent over this connection: */ - split_rcpts(tmp_list, route->not_allowed_rcpt_domains, NULL, p_non_rcpt_list, p_rcpt_list); + split_rcpts(tmp_list, route->denied_recipients, NULL, p_non_rcpt_list, p_rcpt_list); g_list_free(tmp_list); }