[Mimedefang] Order of the fuctions?
James Ebright
jebright at esisnet.com
Wed Jun 22 09:41:17 EDT 2005
Well, I will try your method of replying :-)
On Wed, 22 Jun 2005 00:28:55 +0200, Jan Pieter Cornet wrote
> recipients.c has no milter calls in it, so it must be confusing
> comparing those two.
The code I was referring to about the milter interface in recipients.c refers
specifically to modifying the recipients list I believe, it is one function
inside a precompiler if statement and only available if milter is available:
#if MILTER
/*
** REMOVEFROMLIST -- Remove addresses from a send list.
**
** The parameter is a comma-separated list of recipients to remove.
** Note that it only deletes matching addresses. If those addresses
** have been expanded already in the sendq, it won't mark the
** expanded recipients as QS_REMOVED.
**
** Parameters:
** list -- the list to remove.
** sendq -- a pointer to the head of a queue to remove
** these addresses from.
** e -- the envelope in which to remove these recipients.
**
** Returns:
** The number of addresses removed from the list.
**
*/
int
removefromlist(list, sendq, e)
char *list;
ADDRESS **sendq;
ENVELOPE *e;
{
SM_NONVOLATILE char delimiter; /* the address delimiter */
SM_NONVOLATILE int naddrs;
SM_NONVOLATILE int i;
char *p;
char *oldto = e->e_to;
char *SM_NONVOLATILE bufp;
char buf[MAXNAME + 1];
if (list == NULL)
{
syserr("removefromlist: null list");
return 0;
}
if (tTd(25, 1))
sm_dprintf("removefromlist: %s\n", list);
/* heuristic to determine old versus new style addresses */
if (strchr(list, ',') != NULL || strchr(list, ';') != NULL ||
strchr(list, '<') != NULL || strchr(list, '(') != NULL)
e->e_flags &= ~EF_OLDSTYLE;
delimiter = ' ';
if (!bitset(EF_OLDSTYLE, e->e_flags))
delimiter = ',';
naddrs = 0;
/* make sure we have enough space to copy the string */
i = strlen(list) + 1;
if (i <= sizeof buf)
{
bufp = buf;
i = sizeof buf;
}
else
bufp = sm_malloc_x(i);
SM_TRY
{
(void) sm_strlcpy(bufp, denlstring(list, false, true), i);
macdefine(&e->e_macro, A_PERM, macid("{addr_type}"), "e r");
for (p = bufp; *p != '\0'; )
{
ADDRESS a; /* parsed address to be removed */
ADDRESS *q;
ADDRESS **pq;
char *delimptr;
/* parse the address */
while ((isascii(*p) && isspace(*p)) || *p == ',')
p++;
if (parseaddr(p, &a, RF_COPYALL,
delimiter, &delimptr, e, true) == NULL)
{
p = delimptr;
continue;
}
p = delimptr;
for (pq = sendq; (q = *pq) != NULL; pq = &q->q_next)
{
if (!QS_IS_DEAD(q->q_state) &&
(sameaddr(q, &a) ||
strcmp(q->q_paddr, a.q_paddr) == 0))
{
if (tTd(25, 5))
{
sm_dprintf("removefromlist: QS_REMOVED ");
printaddr(sm_debug_file(), &a, false);
}
q->q_state = QS_REMOVED;
naddrs++;
break;
}
}
}
}
SM_FINALLY
{
e->e_to = oldto;
if (bufp != buf)
sm_free(bufp);
macdefine(&e->e_macro, A_PERM, macid("{addr_type}"), NULL);
}
SM_END_TRY
return naddrs;
}
#endif /* MILTER */
> Yes, this is true (except you cannot modify the recipients list at
> each point, only at the xxfi_eom callback).
Yes, that makes sense.
> I suspect your confusion arises from the fact that your unsure which
> parts of the verification is done by sendmail rulesets, and which
> part is done in mimedefang via milter calls, or maybe you think that
> mimedefang is called as part of some rulesets. It isn't. MD is
> called via the milter interface, which is pretty much completely
> separated from the rulesets.
Yes, still going through the source now and yes, I thought MDs milter
invocation for filter_relay, filter_recipients and filter_sender was called
via the specific check rulesets for those three. Looks like I was incorrect
there. I have done some extensive logging, but configured for our localized
scenario, as I pointed out, some check rulesets can be skipped due to auth and
I check for auth in filter_begin (earliest I know of that you can check for
authenticated users in MD [I use the global array SendmailMacros]) and skip
portions of my MD filter if the user authenticated as well. Most actions in
filter_recipients and filter_relay I dont actually take at that time but save
to a state file and do not take any action until after I can check for
authentication.
Jim
--
EsisNet.com Webmail Client
More information about the MIMEDefang
mailing list