Hi

I don't think you need to strsep out the style yourself, a NULL style to
auth_userokay will look for it after a : itself.

Otherwise this reads fine to me.


On Mon, Jun 27, 2011 at 07:30:53PM +0200, Nils Anspach wrote:
> Hello list,
> 
> attached is a patch for popa3d(8) to use BSD authentication.
> 
> Currently, to authenticate users, popa3d(8) encrypts the user-provided
> password via crypt(3) and then compares the hash with the passwd field
> from master.passwd(5).  This method however does not work if users are
> authenticated by other means when logging into the machine (e.g. via
> login_ldap(8)).  The attached patch allows for such authentication
> styles.
> 
> Nils
> Index: auth_passwd.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/popa3d/auth_passwd.c,v
> retrieving revision 1.2
> diff -u -r1.2 auth_passwd.c
> --- auth_passwd.c     21 Sep 2001 20:22:06 -0000      1.2
> +++ auth_passwd.c     27 Jun 2011 16:48:21 -0000
> @@ -6,7 +6,7 @@
>  
>  #include "params.h"
>  
> -#if AUTH_PASSWD && !VIRTUAL_ONLY
> +#if BSD_AUTH && !VIRTUAL_ONLY
>  
>  #define _XOPEN_SOURCE 4
>  #define _XOPEN_SOURCE_EXTENDED
> @@ -16,8 +16,10 @@
>  #include <string.h>
>  #include <pwd.h>
>  #include <sys/types.h>
> +#include <login_cap.h>
> +#include <bsd_auth.h>
>  
> -struct passwd *auth_userpass(char *user, char *pass, int *known)
> +struct passwd *auth_userpass(char *user, char *style, char *pass, int *known)
>  {
>       struct passwd *pw, *result;
>  
> @@ -25,11 +27,7 @@
>       endpwent();
>       result = NULL;
>  
> -     if (!pw || !*pw->pw_passwd ||
> -         *pw->pw_passwd == '*' || *pw->pw_passwd == '!')
> -             crypt(pass, AUTH_DUMMY_SALT);
> -     else
> -     if (!strcmp(crypt(pass, pw->pw_passwd), pw->pw_passwd))
> +     if (pw && auth_userokay(user, style, BSD_AUTH_TYPE, pass))
>               result = pw;
>  
>       if (pw)
> Index: params.h
> ===================================================================
> RCS file: /cvs/src/usr.sbin/popa3d/params.h,v
> retrieving revision 1.9
> diff -u -r1.9 params.h
> --- params.h  16 Dec 2009 20:42:26 -0000      1.9
> +++ params.h  27 Jun 2011 16:48:22 -0000
> @@ -142,15 +142,23 @@
>  /*
>   * Choose the password authentication method your system uses:
>   *
> - * AUTH_PASSWD               Use getpwnam(3) only, for *BSD or readable 
> passwd;
> - *
> - * Note that there's no built-in password aging support.
> + * BSD_AUTH          Use BSD Authentication.
> + * 
>   */
> -#define AUTH_PASSWD                  1
> +#define BSD_AUTH                     1
> +
> +#if BSD_AUTH
> +
> +/*
> + * BSD Authentication type
> + */
> +#define BSD_AUTH_TYPE                        "auth-popa3d"
> +
> +#endif
>  
>  #endif
>  
> -#if POP_VIRTUAL || AUTH_PASSWD
> +#if POP_VIRTUAL
>  
>  /*
>   * A salt used to waste some CPU time on dummy crypt(3) calls and make
> Index: pop_root.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/popa3d/pop_root.c,v
> retrieving revision 1.5
> diff -u -r1.5 pop_root.c
> --- pop_root.c        3 May 2005 05:44:35 -0000       1.5
> +++ pop_root.c        27 Jun 2011 16:48:22 -0000
> @@ -9,7 +9,7 @@
>   * startup.c         if supporting command line options (POP_OPTIONS)
>   * standalone.c              if not running via an inetd clone 
> (POP_STANDALONE)
>   * virtual.c         if supporting virtual domains (POP_VIRTUAL)
> - * auth_passwd.c     if using passwd or *BSD (AUTH_PASSWD && !VIRTUAL_ONLY)
> + * auth_passwd.c     if using BSD Auth. (BSD_AUTH && !VIRTUAL_ONLY)
>   */
>  
>  #include <unistd.h>
> @@ -34,7 +34,7 @@
>  #endif
>  
>  #if !VIRTUAL_ONLY
> -extern struct passwd *auth_userpass(char *user, char *pass, int *known);
> +extern struct passwd *auth_userpass(char *user, char *style, char *pass, int 
> *known);
>  #endif
>  
>  /* POP_USER's pw_uid and pw_gid, other fields may not be valid */
> @@ -110,6 +110,9 @@
>  {
>       static char auth[AUTH_BUFFER_SIZE + 2];
>       char *pass;
> +#if BSD_AUTH
> +     char *style;
> +#endif
>       struct passwd *pw;
>  
>       known = 0;
> @@ -130,8 +133,15 @@
>               return AUTH_NONE;
>       }
>  
> +#if BSD_AUTH
> +     style = auth;
> +     pass = &style[strlen(style) + 1];
> +     user = strsep(&style, ":");
> +#else
>       user = auth;
>       pass = &user[strlen(user) + 1];
> +#endif
> +     if (!*pass) return AUTH_FAILED;
>  
>       pw = NULL;
>  #if POP_VIRTUAL
> @@ -145,13 +155,17 @@
>               memset(pass, 0, strlen(pass));
>               return AUTH_FAILED;
>       }
> +#elif BSD_AUTH
> +     if (!pw && !(pw = auth_userpass(user, style, pass, &known))) {
> +             memset(pass, 0, strlen(pass));
> +             return AUTH_FAILED;
> +     }
>  #else
> -     if (!pw && !(pw = auth_userpass(user, pass, &known))) {
> +     if (!pw) {
>               memset(pass, 0, strlen(pass));
>               return AUTH_FAILED;
>       }
>  #endif
> -     if (!*pass) return AUTH_FAILED;
>       memset(pass, 0, strlen(pass));
>       if (!*user) return AUTH_FAILED;
>  
> Index: popa3d.8
> ===================================================================
> RCS file: /cvs/src/usr.sbin/popa3d/popa3d.8,v
> retrieving revision 1.14
> diff -u -r1.14 popa3d.8
> --- popa3d.8  31 May 2007 19:20:27 -0000      1.14
> +++ popa3d.8  27 Jun 2011 16:48:22 -0000
> @@ -102,6 +102,12 @@
>  .Pp
>  .Dl pop3 stream tcp nowait root /usr/libexec/tcpd /usr/sbin/popa3d
>  .Pp
> +.Nm
> +uses BSD Authentication with authentication type
> +.Dq auth-popa3d
> +for the given username and password ; see
> +.Xr login.conf 5 .
> +.Pp
>  For access to a mailbox through the POP3 service, the username must
>  be in the password database.
>  Additionally,
> @@ -165,6 +171,7 @@
>  .Sh SEE ALSO
>  .Xr hosts_access 5 ,
>  .Xr inetd 8 ,
> +.Xr login.conf 5 ,
>  .Xr sendmail 8 ,
>  .Xr tcpd 8
>  .Pp

Reply via email to