[exim-cvs] cvs commit: exim/exim-doc/doc-txt ChangeLog NewSt…

Top Page
Delete this message
Reply to this message
Author: Philip Hazel
Date:  
To: exim-cvs
Subject: [exim-cvs] cvs commit: exim/exim-doc/doc-txt ChangeLog NewStuff OptionLists.txt exim/exim-src/scripts MakeLinks exim/exim-src/src functions.h globals.c structs.h exim/exim-src/src/auths Makefile REA
ph10 2006/10/16 16:44:36 BST

  Modified files:
    exim-doc/doc-txt     ChangeLog NewStuff OptionLists.txt 
    exim-src/scripts     MakeLinks 
    exim-src/src         functions.h globals.c structs.h 
    exim-src/src/auths   Makefile README cram_md5.c cyrus_sasl.c 
                         dovecot.c plaintext.c plaintext.h spa.c 
    exim-test/confs      3500 
    exim-test/scripts/3500-CRAM-MD5 3500 
    exim-test/stderr     3500 
    exim-test/stdout     3407 3500 
  Added files:
    exim-src/src/auths   check_serv_cond.c 
  Log:
  Add server_condition to all authenticators, to allow for additional
  conditions (and thereby implement authorization).


  Revision  Changes    Path
  1.410     +5 -0      exim/exim-doc/doc-txt/ChangeLog
  1.117     +7 -0      exim/exim-doc/doc-txt/NewStuff
  1.25      +1 -1      exim/exim-doc/doc-txt/OptionLists.txt
  1.8       +1 -0      exim/exim-src/scripts/MakeLinks
  1.5       +23 -22    exim/exim-src/src/auths/Makefile
  1.6       +1 -1      exim/exim-src/src/auths/README
  1.1       +99 -0     exim/exim-src/src/auths/check_serv_cond.c (new)
  1.6       +2 -1      exim/exim-src/src/auths/cram_md5.c
  1.5       +5 -3      exim/exim-src/src/auths/cyrus_sasl.c
  1.3       +3 -1      exim/exim-src/src/auths/dovecot.c
  1.6       +7 -57     exim/exim-src/src/auths/plaintext.c
  1.5       +0 -1      exim/exim-src/src/auths/plaintext.h
  1.8       +6 -3      exim/exim-src/src/auths/spa.c
  1.29      +1 -0      exim/exim-src/src/functions.h
  1.60      +3 -0      exim/exim-src/src/globals.c
  1.13      +1 -0      exim/exim-src/src/structs.h
  1.3       +2 -1      exim/exim-test/confs/3500
  1.2       +11 -0     exim/exim-test/scripts/3500-CRAM-MD5/3500
  1.3       +41 -2     exim/exim-test/stderr/3500
  1.3       +4 -4      exim/exim-test/stdout/3407
  1.2       +23 -0     exim/exim-test/stdout/3500


  Index: ChangeLog
  ===================================================================
  RCS file: /home/cvs/exim/exim-doc/doc-txt/ChangeLog,v
  retrieving revision 1.409
  retrieving revision 1.410
  diff -u -r1.409 -r1.410
  --- ChangeLog    16 Oct 2006 13:43:21 -0000    1.409
  +++ ChangeLog    16 Oct 2006 15:44:36 -0000    1.410
  @@ -1,4 +1,4 @@
  -$Cambridge: exim/exim-doc/doc-txt/ChangeLog,v 1.409 2006/10/16 13:43:21 ph10 Exp $
  +$Cambridge: exim/exim-doc/doc-txt/ChangeLog,v 1.410 2006/10/16 15:44:36 ph10 Exp $


   Change log file for Exim from version 4.21
   -------------------------------------------
  @@ -149,6 +149,11 @@
         if the connection is using TLS or if the remote IP is the same as the
         local IP, and the "valid-client-cert option" if a client certificate has
         been verified.
  +
  +PH/22 As suggested by Denis Davies, added a server_condition option to *all*
  +      authenticators. This can be used for authorization after authentication
  +      succeeds. (In the case of plaintext, it servers for both authentication
  +      and authorization.)



Exim version 4.63

  Index: NewStuff
  ===================================================================
  RCS file: /home/cvs/exim/exim-doc/doc-txt/NewStuff,v
  retrieving revision 1.116
  retrieving revision 1.117
  diff -u -r1.116 -r1.117
  --- NewStuff    16 Oct 2006 13:43:21 -0000    1.116
  +++ NewStuff    16 Oct 2006 15:44:36 -0000    1.117
  @@ -1,4 +1,4 @@
  -$Cambridge: exim/exim-doc/doc-txt/NewStuff,v 1.116 2006/10/16 13:43:21 ph10 Exp $
  +$Cambridge: exim/exim-doc/doc-txt/NewStuff,v 1.117 2006/10/16 15:44:36 ph10 Exp $


   New Features in Exim
   --------------------
  @@ -123,6 +123,13 @@
      In this case there is a lookup in dnsbl.sorbs.net, and if none of the IP
      values matches (or if no record is found), this is the only lookup that is
      done. Only if there is a match is one of the more specific lists consulted.
  +
  +6. All authenticators now have a server_condition option. Previously, only
  +   plaintext had this, and this has not changed: it must be set to the
  +   authenticator as a server. For the others, if server_condition is set, it is
  +   expanded if authentication is successful, and treated exactly as it is in
  +   plaintext. This can serve as a means of adding authorization to an
  +   authenticator.



Version 4.63

  Index: OptionLists.txt
  ===================================================================
  RCS file: /home/cvs/exim/exim-doc/doc-txt/OptionLists.txt,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- OptionLists.txt    22 Sep 2006 14:01:12 -0000    1.24
  +++ OptionLists.txt    16 Oct 2006 15:44:36 -0000    1.25
  @@ -1,4 +1,4 @@
  -$Cambridge: exim/exim-doc/doc-txt/OptionLists.txt,v 1.24 2006/09/22 14:01:12 ph10 Exp $
  +$Cambridge: exim/exim-doc/doc-txt/OptionLists.txt,v 1.25 2006/10/16 15:44:36 ph10 Exp $


   LISTS OF EXIM OPTIONS
   ---------------------
  @@ -442,7 +442,7 @@
   senders                              address list    unset         routers           4.00
   serialize_hosts                      host list       unset         smtp              1.60
   server_advertise_condition           string*         unset         authenticators    4.14
  -server_condition                     string*         unset         plaintext         3.10
  +server_condition                     string*         unset         authenticators    3.10 (plaintext) 4.64 (others)
   server_hostname                      string*   "$primary_hostname" cyrus_sasl        4.43
   server_mail_auth_condition           string*         unset         authenticators    3.22
   server_mech                          string          public_name   cyrus_sasl        4.43


  Index: MakeLinks
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/scripts/MakeLinks,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- MakeLinks    2 Oct 2006 13:38:18 -0000    1.7
  +++ MakeLinks    16 Oct 2006 15:44:36 -0000    1.8
  @@ -1,5 +1,5 @@
   #!/bin/sh
  -# $Cambridge: exim/exim-src/scripts/MakeLinks,v 1.7 2006/10/02 13:38:18 ph10 Exp $
  +# $Cambridge: exim/exim-src/scripts/MakeLinks,v 1.8 2006/10/16 15:44:36 ph10 Exp $


   # Script to build links for all the exim source files from the system-
   # specific build directory. It should be run from within that directory.
  @@ -162,6 +162,7 @@
   ln -s ../../src/auths/call_pam.c         call_pam.c
   ln -s ../../src/auths/call_pwcheck.c     call_pwcheck.c
   ln -s ../../src/auths/call_radius.c      call_radius.c
  +ln -s ../../src/auths/check_serv_cond.c  check_serv_cond.c
   ln -s ../../src/auths/cyrus_sasl.c       cyrus_sasl.c
   ln -s ../../src/auths/cyrus_sasl.h       cyrus_sasl.h
   ln -s ../../src/auths/get_data.c         get_data.c


  Index: functions.h
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/functions.h,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- functions.h    9 Oct 2006 14:36:25 -0000    1.28
  +++ functions.h    16 Oct 2006 15:44:36 -0000    1.29
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/functions.h,v 1.28 2006/10/09 14:36:25 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/src/functions.h,v 1.29 2006/10/16 15:44:36 ph10 Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -49,6 +49,7 @@
   extern int     auth_call_radius(uschar *, uschar **);
   extern int     auth_call_saslauthd(uschar *, uschar *, uschar *, uschar *,
                    uschar **);
  +extern int     auth_check_serv_cond(auth_instance *);
   extern int     auth_get_data(uschar **, uschar *, int);
   extern int     auth_get_no64_data(uschar **, uschar *);
   extern uschar *auth_xtextencode(uschar *, int);


  Index: globals.c
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/globals.c,v
  retrieving revision 1.59
  retrieving revision 1.60
  diff -u -r1.59 -r1.60
  --- globals.c    25 Sep 2006 10:14:20 -0000    1.59
  +++ globals.c    16 Oct 2006 15:44:36 -0000    1.60
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/globals.c,v 1.59 2006/09/25 10:14:20 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/src/globals.c,v 1.60 2006/10/16 15:44:36 ph10 Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -38,6 +38,8 @@
                    (void *)(offsetof(auth_instance, public_name)) },
     { "server_advertise_condition", opt_stringptr | opt_public,
                    (void *)(offsetof(auth_instance, advertise_condition))},
  +  { "server_condition", opt_stringptr | opt_public,
  +                 (void *)(offsetof(auth_instance, server_condition)) },
     { "server_debug_print", opt_stringptr | opt_public,
                    (void *)(offsetof(auth_instance, server_debug_string)) },
     { "server_mail_auth_condition", opt_stringptr | opt_public,
  @@ -325,6 +327,7 @@
       NULL,                      /* set_id */
       NULL,                      /* server_mail_auth_condition */
       NULL,                      /* server_debug_string */
  +    NULL,                      /* server_condition */
       FALSE,                     /* client */
       FALSE,                     /* server */
       FALSE                      /* advertised */


  Index: structs.h
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/structs.h,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- structs.h    25 Sep 2006 11:25:37 -0000    1.12
  +++ structs.h    16 Oct 2006 15:44:36 -0000    1.13
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/structs.h,v 1.12 2006/09/25 11:25:37 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/src/structs.h,v 1.13 2006/10/16 15:44:36 ph10 Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -367,6 +367,7 @@
     uschar *set_id;                 /* String to set as authenticated id */
     uschar *mail_auth_condition;    /* Condition for AUTH on MAIL command */
     uschar *server_debug_string;    /* Debugging output */
  +  uschar *server_condition;       /* Authorization condition */
     BOOL    client;                 /* TRUE if client option(s) set */
     BOOL    server;                 /* TRUE if server options(s) set */
     BOOL    advertised;             /* Set TRUE when advertised */


Index: check_serv_cond.c
====================================================================
/* $Cambridge: exim/exim-src/src/auths/check_serv_cond.c,v 1.1 2006/10/16 15:44:36 ph10 Exp $ */

  /*************************************************
  *     Exim - an Internet mail transport agent    *
  *************************************************/


/* Copyright (c) University of Cambridge 1995 - 2006 */
/* See the file NOTICE for conditions of use and distribution. */

#include "../exim.h"

/* This module contains the function server_condition(), which is used
by all authenticators. */


  /*************************************************
  *              Check server_condition            *
  *************************************************/


/* This function is called from the server code of all authenticators. For
plaintext, it is always called: the argument cannot be empty, because for
plaintext, setting server_condition is what enables it as a server
authenticator. For all the other authenticators, this function is called after
they have authenticated, to enable additional authorization to be done.

  Argument:     the authenticator's instance block


  Returns:
    OK          NULL argument, or success
    DEFER       couldn't complete the check
    FAIL        authentication failed
  */


int
auth_check_serv_cond(auth_instance *ablock)
{
uschar *cond;

  HDEBUG(D_auth)
    {
    int i;
    debug_printf("%s authenticator:\n", ablock->name);
    for (i = 0; i < AUTH_VARS; i++)
      {
      if (auth_vars[i] != NULL)
        debug_printf("  $auth%d = %s\n", i + 1, auth_vars[i]);
      }
    for (i = 1; i <= expand_nmax; i++)
      debug_printf("  $%d = %.*s\n", i, expand_nlength[i], expand_nstring[i]);
    debug_print_string(ablock->server_debug_string);    /* customized debug */
    }


/* For the plaintext authenticator, server_condition is never NULL. For the
rest, an unset condition lets everything through. */

if (ablock->server_condition == NULL) return OK;
cond = expand_string(ablock->server_condition);

  HDEBUG(D_auth)
    {
    if (cond == NULL)
      debug_printf("expansion failed: %s\n", expand_string_message);
    else
      debug_printf("expanded string: %s\n", cond);
    }


/* A forced expansion failure causes authentication to fail. Other expansion
failures yield DEFER, which will cause a temporary error code to be returned to
the AUTH command. The problem is at the server end, so the client should try
again later. */

  if (cond == NULL)
    {
    if (expand_string_forcedfail) return FAIL;
    auth_defer_msg = expand_string_message;
    return DEFER;
    }


/* Return FAIL for empty string, "0", "no", and "false"; return OK for
"1", "yes", and "true"; return DEFER for anything else, with the string
available as an error text for the user. */

  if (*cond == 0 ||
      Ustrcmp(cond, "0") == 0 ||
      strcmpic(cond, US"no") == 0 ||
      strcmpic(cond, US"false") == 0)
    return FAIL;


  if (Ustrcmp(cond, "1") == 0 ||
      strcmpic(cond, US"yes") == 0 ||
      strcmpic(cond, US"true") == 0)
    return OK;


auth_defer_msg = cond;
auth_defer_user_msg = string_sprintf(": %s", cond);
return DEFER;
}

/* End of check_serv_cond.c */

  Index: Makefile
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/auths/Makefile,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- Makefile    2 Oct 2006 13:38:18 -0000    1.4
  +++ Makefile    16 Oct 2006 15:44:36 -0000    1.5
  @@ -1,4 +1,4 @@
  -# $Cambridge: exim/exim-src/src/auths/Makefile,v 1.4 2006/10/02 13:38:18 ph10 Exp $
  +# $Cambridge: exim/exim-src/src/auths/Makefile,v 1.5 2006/10/16 15:44:36 ph10 Exp $


# Make file for building a library containing all the available authorization
# methods, and calling it auths.a. In addition, there are functions that are
@@ -7,10 +7,10 @@
# after cd'ing to the auths subdirectory. When the relevant AUTH_ macros are
# defined, the equivalent modules herein is not included in the final binary.

  -OBJ = b64encode.o b64decode.o call_pam.o call_pwcheck.o call_radius.o \
  -      xtextencode.o xtextdecode.o get_data.o get_no64_data.o md5.o \
  -      cram_md5.o cyrus_sasl.o dovecot.o plaintext.o pwcheck.o sha1.o \
  -      auth-spa.o spa.o
  +OBJ = auth-spa.o b64decode.o b64encode.o call_pam.o call_pwcheck.o \
  +      call_radius.o check_serv_cond.o cram_md5.o cyrus_sasl.o dovecot.o \
  +      get_data.o get_no64_data.o md5.o plaintext.o pwcheck.o sha1.o \
  +      spa.o xtextdecode.o xtextencode.o


   auths.a:         $(OBJ)
            @$(RM_COMMAND) -f auths.a
  @@ -23,24 +23,25 @@
   .c.o:;           @echo "$(CC) $*.c"
            $(FE)$(CC) -c $(CFLAGS) $(INCLUDE) $*.c


  -auth-spa.o:      $(HDRS) auth-spa.c
  -b64encode.o:     $(HDRS) b64encode.c
  -b64decode.o:     $(HDRS) b64decode.c
  -call_pam.o:      $(HDRS) call_pam.c
  -call_pwcheck.o:  $(HDRS) call_pwcheck.c pwcheck.h
  -call_radius.o:   $(HDRS) call_radius.c
  -get_data.o:      $(HDRS) get_data.c
  -get_no64_data.o: $(HDRS) get_no64_data.c
  -md5.o:           $(HDRS) md5.c
  -pwcheck.o:       $(HDRS) pwcheck.c pwcheck.h
  -sha1.o:          $(HDRS) sha1.c
  -xtextencode.o:   $(HDRS) xtextencode.c
  -xtextdecode.o:   $(HDRS) xtextdecode.c
  -
  -cram_md5.o:      $(HDRS) cram_md5.c cram_md5.h
  -cyrus_sasl.o:    $(HDRS) cyrus_sasl.c cyrus_sasl.h
  -dovecot.o:       $(HDRS) dovecot.c dovecot.h
  -plaintext.o:     $(HDRS) plaintext.c plaintext.h
  -spa.o:           $(HDRS) spa.c spa.h
  +auth-spa.o:         $(HDRS) auth-spa.c
  +b64encode.o:        $(HDRS) b64encode.c
  +b64decode.o:        $(HDRS) b64decode.c
  +call_pam.o:         $(HDRS) call_pam.c
  +call_pwcheck.o:     $(HDRS) call_pwcheck.c pwcheck.h
  +call_radius.o:      $(HDRS) call_radius.c
  +check_serv_cond.o:  $(HDRS) check_serv_cond.c
  +get_data.o:         $(HDRS) get_data.c
  +get_no64_data.o:    $(HDRS) get_no64_data.c
  +md5.o:              $(HDRS) md5.c
  +pwcheck.o:          $(HDRS) pwcheck.c pwcheck.h
  +sha1.o:             $(HDRS) sha1.c
  +xtextdecode.o:      $(HDRS) xtextdecode.c
  +xtextencode.o:      $(HDRS) xtextencode.c
  +
  +cram_md5.o:         $(HDRS) cram_md5.c cram_md5.h
  +cyrus_sasl.o:       $(HDRS) cyrus_sasl.c cyrus_sasl.h
  +dovecot.o:          $(HDRS) dovecot.c dovecot.h
  +plaintext.o:        $(HDRS) plaintext.c plaintext.h
  +spa.o:              $(HDRS) spa.c spa.h


# End

  Index: README
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/auths/README,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- README    23 Feb 2006 12:41:22 -0000    1.5
  +++ README    16 Oct 2006 15:44:36 -0000    1.6
  @@ -1,4 +1,4 @@
  -$Cambridge: exim/exim-src/src/auths/README,v 1.5 2006/02/23 12:41:22 ph10 Exp $
  +$Cambridge: exim/exim-src/src/auths/README,v 1.6 2006/10/16 15:44:36 ph10 Exp $


AUTHS

  @@ -59,7 +59,7 @@
     DEFER       couldn't complete the check
     FAIL        authentication failed
     CANCELLED   authentication forced to fail by "*" response to challenge,
  -                or by a forced string expansion failure
  +                or by certain forced string expansion failures
     BAD64       bad base64 data received
     UNEXPECTED  unexpected data received



  Index: cram_md5.c
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/auths/cram_md5.c,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- cram_md5.c    23 Feb 2006 12:41:22 -0000    1.5
  +++ cram_md5.c    16 Oct 2006 15:44:36 -0000    1.6
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/auths/cram_md5.c,v 1.5 2006/02/23 12:41:22 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/src/auths/cram_md5.c,v 1.6 2006/10/16 15:44:36 ph10 Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -233,7 +233,8 @@
           ((b >= 'a')? b - 'a' + 10 : b - '0')) != digest[i]) return FAIL;
     }


-return OK;
+/* Expand server_condition as an authorization check */
+return auth_check_serv_cond(ablock);
}



  Index: cyrus_sasl.c
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/auths/cyrus_sasl.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- cyrus_sasl.c    10 Feb 2006 14:25:43 -0000    1.4
  +++ cyrus_sasl.c    16 Oct 2006 15:44:36 -0000    1.5
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/auths/cyrus_sasl.c,v 1.4 2006/02/10 14:25:43 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/src/auths/cyrus_sasl.c,v 1.5 2006/10/16 15:44:36 ph10 Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -53,7 +53,7 @@
   int auth_cyrus_sasl_options_count =
     sizeof(auth_cyrus_sasl_options)/sizeof(optionlist);


-/* Default private options block for the contidion authentication method. */
+/* Default private options block for the cyrus_sasl authentication method. */

   auth_cyrus_sasl_options_block auth_cyrus_sasl_option_defaults = {
     US"smtp",         /* server_service */
  @@ -332,11 +332,13 @@
       expand_nmax = 1;


       HDEBUG(D_auth)
  -      debug_printf("Cyrus SASL %s authentiction succeeded for %s\n", ob->server_mech, out2);
  +      debug_printf("Cyrus SASL %s authentication succeeded for %s\n", ob->server_mech, out2);
       /* close down the connection, freeing up library's memory */
       sasl_dispose(&conn);
       sasl_done();
  -    return OK;
  +
  +    /* Expand server_condition as an authorization check */
  +    return auth_check_serv_cond(ablock);
       }
     }
   /* NOTREACHED */


  Index: dovecot.c
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/auths/dovecot.c,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- dovecot.c    16 Oct 2006 13:43:22 -0000    1.2
  +++ dovecot.c    16 Oct 2006 15:44:36 -0000    1.3
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/auths/dovecot.c,v 1.2 2006/10/16 13:43:22 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/src/auths/dovecot.c,v 1.3 2006/10/16 15:44:36 ph10 Exp $ */


   /*
    * Copyright (c) 2004 Andrey Panin <pazke@???>
  @@ -309,5 +309,7 @@
          }


   out:   close(fd);
  -       return ret;
  +
  +       /* Expand server_condition as an authorization check */
  +       return (ret == OK)? auth_check_serv_cond(ablock) : ret;
   }


  Index: plaintext.c
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/auths/plaintext.c,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- plaintext.c    23 Feb 2006 12:41:22 -0000    1.5
  +++ plaintext.c    16 Oct 2006 15:44:36 -0000    1.6
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/auths/plaintext.c,v 1.5 2006/02/23 12:41:22 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/src/auths/plaintext.c,v 1.6 2006/10/16 15:44:36 ph10 Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -18,8 +18,6 @@
         (void *)(offsetof(auth_plaintext_options_block, client_ignore_invalid_base64)) },
     { "client_send",        opt_stringptr,
         (void *)(offsetof(auth_plaintext_options_block, client_send)) },
  -  { "server_condition",   opt_stringptr,
  -      (void *)(offsetof(auth_plaintext_options_block, server_condition)) },
     { "server_prompts",     opt_stringptr,
         (void *)(offsetof(auth_plaintext_options_block, server_prompts)) }
   };
  @@ -33,7 +31,6 @@
   /* Default private options block for the plaintext authentication method. */


   auth_plaintext_options_block auth_plaintext_option_defaults = {
  -  NULL,              /* server_condition */
     NULL,              /* server_prompts */
     NULL,              /* client_send */
     FALSE              /* client_ignore_invalid_base64 */
  @@ -54,7 +51,7 @@
   auth_plaintext_options_block *ob =
     (auth_plaintext_options_block *)(ablock->options_block);
   if (ablock->public_name == NULL) ablock->public_name = ablock->name;
  -if (ob->server_condition != NULL) ablock->server = TRUE;
  +if (ablock->server_condition != NULL) ablock->server = TRUE;
   if (ob->client_send != NULL) ablock->client = TRUE;
   }


  @@ -72,7 +69,7 @@
   auth_plaintext_options_block *ob =
     (auth_plaintext_options_block *)(ablock->options_block);
   uschar *prompts = ob->server_prompts;
  -uschar *clear, *cond, *end, *s;
  +uschar *clear, *end, *s;
   int number = 1;
   int len, rc;
   int sep = 0;
  @@ -141,59 +138,12 @@
     }


/* We now have a number of items of data in $auth1, $auth2, etc (and also, for
-compatibility, in $1, $2, etc). Match against the decoded data by expanding the
-condition. */
+compatibility, in $1, $2, etc). Authentication and authorization are handled
+together for this authenticator by expanding the server_condition option. Note
+that ablock->server_condition is always non-NULL because that's what configures
+this authenticator as a server. */

  -cond = expand_string(ob->server_condition);
  -
  -HDEBUG(D_auth)
  -  {
  -  int i;
  -  debug_printf("%s authenticator:\n", ablock->name);
  -  for (i = 0; i < AUTH_VARS; i++)
  -    {
  -    if (auth_vars[i] != NULL)
  -      debug_printf("  $auth%d = %s\n", i + 1, auth_vars[i]);
  -    }
  -  for (i = 1; i <= expand_nmax; i++)
  -    debug_printf("  $%d = %.*s\n", i, expand_nlength[i], expand_nstring[i]);
  -  debug_print_string(ablock->server_debug_string);    /* customized debug */
  -  if (cond == NULL)
  -    debug_printf("expansion failed: %s\n", expand_string_message);
  -  else
  -    debug_printf("expanded string: %s\n", cond);
  -  }
  -
  -/* A forced expansion failure causes authentication to fail. Other expansion
  -failures yield DEFER, which will cause a temporary error code to be returned to
  -the AUTH command. The problem is at the server end, so the client should try
  -again later. */
  -
  -if (cond == NULL)
  -  {
  -  if (expand_string_forcedfail) return FAIL;
  -  auth_defer_msg = expand_string_message;
  -  return DEFER;
  -  }
  -
  -/* Return FAIL for empty string, "0", "no", and "false"; return OK for
  -"1", "yes", and "true"; return DEFER for anything else, with the string
  -available as an error text for the user. */
  -
  -if (*cond == 0 ||
  -    Ustrcmp(cond, "0") == 0 ||
  -    strcmpic(cond, US"no") == 0 ||
  -    strcmpic(cond, US"false") == 0)
  -  return FAIL;
  -
  -if (Ustrcmp(cond, "1") == 0 ||
  -    strcmpic(cond, US"yes") == 0 ||
  -    strcmpic(cond, US"true") == 0)
  -  return OK;
  -
  -auth_defer_msg = cond;
  -auth_defer_user_msg = string_sprintf(": %s", cond);
  -return DEFER;
  +return auth_check_serv_cond(ablock);
   }




  Index: plaintext.h
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/auths/plaintext.h,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- plaintext.h    23 Feb 2006 12:41:22 -0000    1.4
  +++ plaintext.h    16 Oct 2006 15:44:36 -0000    1.5
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/auths/plaintext.h,v 1.4 2006/02/23 12:41:22 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/src/auths/plaintext.h,v 1.5 2006/10/16 15:44:36 ph10 Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -10,7 +10,6 @@
   /* Private structure for the private options. */


   typedef struct {
  -  uschar *server_condition;
     uschar *server_prompts;
     uschar *client_send;
     BOOL    client_ignore_invalid_base64;


  Index: spa.c
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/auths/spa.c,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- spa.c    23 Feb 2006 12:41:22 -0000    1.7
  +++ spa.c    16 Oct 2006 15:44:36 -0000    1.8
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/auths/spa.c,v 1.7 2006/02/23 12:41:22 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/src/auths/spa.c,v 1.8 2006/10/16 15:44:36 ph10 Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -25,8 +25,9 @@
    * typedef unsigned uint32;
    * typedef unsigned char  uint8;


  -07-August-2003: PH: Patched up the code to avoid assert bombouts for stupid
  -                    input data. Find appropriate comment by grepping for "PH".
  +07-August-2003:  PH: Patched up the code to avoid assert bombouts for stupid
  +                     input data. Find appropriate comment by grepping for "PH".
  +16-October-2006: PH: Added a call to auth_check_serv_cond() at the end
   */



  @@ -231,7 +232,9 @@
         ((unsigned char*)responseptr)+IVAL(&responseptr->ntResponse.offset,0),
         24) == 0)
     /* success. we have a winner. */
  -  return OK;
  +
  +  /* Expand server_condition as an authorization check (PH) */
  +  return auth_check_serv_cond(ablock);


return FAIL;
}

  Index: 3500
  ===================================================================
  RCS file: /home/cvs/exim/exim-test/confs/3500,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- 3500    10 Feb 2006 14:25:43 -0000    1.2
  +++ 3500    16 Oct 2006 15:44:36 -0000    1.3
  @@ -13,7 +13,7 @@


domainlist local_domains = test.ex : *.test.ex

-hostlist auth_hosts = 10.0.0.1
+hostlist auth_hosts = 10.0.0.1 : 10.0.0.5
hostlist relay_hosts = 10.0.0.4
hostlist auth_relay_hosts = 10.0.0.3 : 10.0.0.4

  @@ -80,6 +80,7 @@
     server_secret = "${if eq{$auth1}{tim}{tanstaaftanstaaf}\
       {${if eq{$auth1}{userx}{secret}fail}}}"
     server_set_id = $auth1
  +  server_condition = ${if !eq {$sender_host_address}{10.0.0.5}}





  Index: 3500
  ===================================================================
  RCS file: /home/cvs/exim/exim-test/scripts/3500-CRAM-MD5/3500,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- 3500    7 Feb 2006 10:54:49 -0000    1.1
  +++ 3500    16 Oct 2006 15:44:36 -0000    1.2
  @@ -32,4 +32,15 @@
   .
   quit
   ****
  +exim -bh 10.0.0.5
  +ehlo test.host
  +AUTH CRAM-MD5
  +dGltIGI5MTNhNjAyYzdlZGE3YTQ5NWI0ZTZlNzMzNGQzODkw
  +mail from:<userx@???>
  +rcpt to:<userx@???>
  +data
  +Testing authenticated CRAM-MD5.
  +.
  +quit
  +****
   no_msglog_check


  Index: 3500
  ===================================================================
  RCS file: /home/cvs/exim/exim-test/stderr/3500,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- 3500    10 Feb 2006 14:25:44 -0000    1.2
  +++ 3500    16 Oct 2006 15:44:36 -0000    1.3
  @@ -8,7 +8,7 @@
   >>> host in helo_accept_junk_hosts? no (option unset)
   >>> test.host in helo_lookup_domains? no (end of list)
   >>> host in pipelining_advertise_hosts? yes (matched "*")
  ->>> host in "10.0.0.1"? no (end of list)
  +>>> host in "10.0.0.1 : 10.0.0.5"? no (end of list)
   >>> host in "10.0.0.4"? yes (matched "10.0.0.4")
   >>> host in auth_advertise_hosts? no (matched "!+relay_hosts")
   >>> host in hosts_connection_nolog? no (option unset)
  @@ -21,13 +21,18 @@
   >>> host in helo_accept_junk_hosts? no (option unset)
   >>> test.host in helo_lookup_domains? no (end of list)
   >>> host in pipelining_advertise_hosts? yes (matched "*")
  ->>> host in "10.0.0.1"? yes (matched "10.0.0.1")
  +>>> host in "10.0.0.1 : 10.0.0.5"? yes (matched "10.0.0.1")
   >>> host in auth_advertise_hosts? yes (matched "+auth_hosts")
   >>> +++CRAM-MD5 $auth1="tim" $auth2="" $auth3=""
   >>> CRAM-MD5: user name = tim
   >>>           challenge = <1896.697170952@???>
   >>>           received  = b913a602c7eda7a495b4e6e7334d3890
   >>>           digest    = b913a602c7eda7a495b4e6e7334d3890
  +>>> cram_md5 authenticator:
  +>>>   $auth1 = tim
  +>>>   $1 = tim
  +>>> +++CRAM-MD5 $auth1="tim" $auth2="" $auth3=""
  +>>> expanded string: true
   >>> using ACL "check_recipient"
   >>> processing "warn"
   >>> check hosts = 10.0.0.5
  @@ -54,3 +59,37 @@
   >>> accept: condition test succeeded
   >>> host in ignore_fromline_hosts? no (option unset)
   LOG: 10HmaY-0005vi-00 <= userx@??? H=(test.host) [10.0.0.1] P=esmtpa A=cram_md5:tim S=sss
  +>>> host in hosts_connection_nolog? no (option unset)
  +>>> host in host_lookup? no (option unset)
  +>>> host in host_reject_connection? no (option unset)
  +>>> host in sender_unqualified_hosts? no (option unset)
  +>>> host in recipient_unqualified_hosts? no (option unset)
  +>>> host in helo_verify_hosts? no (option unset)
  +>>> host in helo_try_verify_hosts? no (option unset)
  +>>> host in helo_accept_junk_hosts? no (option unset)
  +>>> test.host in helo_lookup_domains? no (end of list)
  +>>> host in pipelining_advertise_hosts? yes (matched "*")
  +>>> host in "10.0.0.1 : 10.0.0.5"? yes (matched "10.0.0.5")
  +>>> host in auth_advertise_hosts? yes (matched "+auth_hosts")
  +>>> +++CRAM-MD5 $auth1="tim" $auth2="" $auth3=""
  +>>> CRAM-MD5: user name = tim
  +>>>           challenge = <1896.697170952@???>
  +>>>           received  = b913a602c7eda7a495b4e6e7334d3890
  +>>>           digest    = b913a602c7eda7a495b4e6e7334d3890
  +>>> cram_md5 authenticator:
  +>>>   $auth1 = tim
  +>>>   $1 = tim
  +>>> +++CRAM-MD5 $auth1="tim" $auth2="" $auth3=""
  +>>> expanded string: 
  +LOG: cram_md5 authenticator failed for (test.host) [10.0.0.5]: 535 Incorrect authentication data (set_id=tim)
  +>>> using ACL "check_recipient"
  +>>> processing "warn"
  +>>> check hosts = 10.0.0.5
  +>>> host in "10.0.0.5"? yes (matched "10.0.0.5")
  +>>> warn: condition test succeeded
  +>>> processing "accept"
  +>>> check hosts = 10.0.0.5
  +>>> host in "10.0.0.5"? yes (matched "10.0.0.5")
  +>>> accept: condition test succeeded
  +>>> host in ignore_fromline_hosts? no (option unset)
  +LOG: 10HmaZ-0005vi-00 <= userx@??? H=(test.host) [10.0.0.5] P=esmtp S=sss


  Index: 3407
  ===================================================================
  RCS file: /home/cvs/exim/exim-test/stdout/3407,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- 3407    23 Feb 2006 12:41:23 -0000    1.2
  +++ 3407    16 Oct 2006 15:44:36 -0000    1.3
  @@ -3,46 +3,46 @@
   driver = plaintext
   public_name = PLAIN
   server_advertise_condition = 
  +server_condition = xxx
   server_debug_print = 
   server_mail_auth_condition = 
   server_set_id = 
   no_client_ignore_invalid_base64
   client_send = 
  -server_condition = xxx
   server_prompts = 


a2 authenticator:
driver = plaintext
public_name = PLAIN
server_advertise_condition =
+server_condition =
server_debug_print =
server_mail_auth_condition =
server_set_id =
no_client_ignore_invalid_base64
client_send =
-server_condition =
server_prompts =

a3 authenticator:
driver = plaintext
public_name = LOGIN
server_advertise_condition =
+server_condition =
server_debug_print =
server_mail_auth_condition =
server_set_id =
no_client_ignore_invalid_base64
client_send =
-server_condition =
server_prompts =

a4 authenticator:
driver = plaintext
public_name = LOGIN
server_advertise_condition =
+server_condition =
server_debug_print =
server_mail_auth_condition =
server_set_id =
no_client_ignore_invalid_base64
client_send =
-server_condition =
server_prompts =

  Index: 3500
  ===================================================================
  RCS file: /home/cvs/exim/exim-test/stdout/3500,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- 3500    7 Feb 2006 10:47:37 -0000    1.1
  +++ 3500    16 Oct 2006 15:44:36 -0000    1.2
  @@ -60,3 +60,26 @@
   **** SMTP testing: that is not a real message id!


221 myhost.test.ex closing connection
+
+**** SMTP testing session as if from host 10.0.0.5
+**** but without any ident (RFC 1413) callback.
+**** This is not for real!
+
+220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+250-myhost.test.ex Hello test.host [10.0.0.5]
+250-SIZE 52428800
+250-ETRN
+250-EXPN
+250-PIPELINING
+250-AUTH CRAM-MD5
+250 HELP
+334 PDE4OTYuNjk3MTcwOTUyQHBvc3RvZmZpY2UucmVzdG9uLm1jaS5uZXQ+
+535 Incorrect authentication data
+250 OK
+250 Accepted
+354 Enter message, ending with "." on a line by itself
+250 OK id=10HmaZ-0005vi-00
+
+**** SMTP testing: that is not a real message id!
+
+221 myhost.test.ex closing connection