Hello,
here is a patch against 3.20 that contains the code from yesterday for
multiple authenticators and new code that adds an optional condition
which must expand to true for the AUTH= value to be accepted. As such,
it realises this paragraph of RFC 2554:
If the server does not sufficiently trust the authenticated
identity of the client, or if the client is not authenticated,
then the server MUST behave as if the AUTH=<> parameter was
supplied. The server MAY, however, write the value of the AUTH
parameter to a log file.
And that's what it does, if the condition expands to false. Perhaps
something fancier than a simple condition is needed, but I think it
suffices for now.
Note: You need to add "*result='\0';" in xtextdecode.c before
returning the result. Consider that addition as well as any usage of
$authenticated_sender as experimental until it is clear how Exim should
deal with binary arguments.
Michael
----------------------------------------------------------------------
--- src/structs.h.orig Thu Jan 11 12:20:01 2001
+++ src/structs.h Thu Jan 11 12:20:54 2001
@@ -386,6 +386,7 @@
char *driver_name; /* Must be first */
char *public_name; /* Advertised name */
char *set_id; /* String to set as authenticated id */
+ char *auth_condition; /* Condition for AUTH= value */
BOOL client; /* TRUE if client option(s) set */
BOOL server; /* TRUE if server options(s) set */
} auth_instance;
--- src/globals.c.orig Thu Jan 11 12:21:01 2001
+++ src/globals.c Thu Jan 11 13:06:36 2001
@@ -49,6 +49,8 @@
data blocks and hence have the opt_public flag set. */
optionlist optionlist_auths[] = {
+ { "auth_condition", opt_stringptr | opt_public,
+ (void *)(offsetof(auth_instance, auth_condition)) },
{ "driver", opt_stringptr | opt_public,
(void *)(offsetof(auth_instance, driver_name)) },
{ "public_name", opt_stringptr | opt_public,
@@ -145,6 +147,7 @@
NULL, /* name */
NULL, /* info */
NULL, /* private options block pointer */
+ NULL, /* auth_condition */
NULL, /* driver_name */
NULL, /* public_name */
NULL, /* set_id */
--- src/smtp_in.c.orig Wed Jan 10 15:38:50 2001
+++ src/smtp_in.c Thu Jan 11 14:27:09 2001
@@ -1816,6 +1816,7 @@
#ifdef HAVE_AUTH
auth_instance *au;
int c;
+ int foundAuthenticator;
#endif
switch(smtp_read_command())
@@ -1872,17 +1873,12 @@
/* Search for an authentication mechanism which is configured for use
as a server. */
- for (au = auths; au != NULL; au = au->next)
+ for (foundAuthenticator = 0, au = auths; au != NULL; au = au->next)
{
- if (strcmpic(s, au->public_name) == 0 && au->server) break;
- }
-
- if (au == NULL)
- {
- smtp_printf("504 %s mechanism not supported\r\n", s);
- break;
- }
+ if (strcmpic(s, au->public_name) == 0 && au->server)
+ {
+ foundAuthenticator=1;
/* Run the checking code, passing the remainder of the command
line as data. Initialize $0 empty. The authenticator may set up
other numeric variables. If authentication succeeds, expand the
@@ -1914,6 +1910,16 @@
expand_nmax = -1; /* Reset numeric variables */
+ if (c!=FAIL) break;
+ }
+ }
+ if (!foundAuthenticator)
+ {
+ smtp_printf("504 %s mechanism not supported\r\n", s);
+ break;
+ }
+
+
switch(c)
{
case OK:
@@ -2375,6 +2381,11 @@
{
smtp_printf("501 %s: invalid AUTH=%s\r\n", smtp_data, value);
goto COMMAND_LOOP;
+ }
+ if (au->auth_condition != NULL && !expand_check_condition(au->auth_condition, au->name, "authenticator"))
+ {
+ authenticated_sender = NULL;
+ log_write(2, LOG_MAIN, "ignoring AUTH=%s from authenticated ID %s",value,authenticated_id);
}
}
}