On Fri, 05 Aug 2016 13:04:42 -0600, "Todd C. Miller" wrote:

> Here is a diff to remove the encrypted password length check.  I
> don't believe that user(8) has any business mucking about with
> either existing encrypted passwords in master.password or with the
> password specified by the user.
> 
> This also eliminates the exceptionally ugly 13 '*' character entries
> that I have always despised.

Anyone have an opinion on this?

 - todd

> Index: usr.sbin/user/user.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/user/user.c,v
> retrieving revision 1.111
> diff -u -p -u -r1.111 user.c
> --- usr.sbin/user/user.c      3 May 2016 21:05:14 -0000       1.111
> +++ usr.sbin/user/user.c      5 Aug 2016 18:57:30 -0000
> @@ -164,9 +164,6 @@ enum {
>       MaxUserNameLen = _PW_NAME_LEN,
>       MaxCommandLen = 2048,
>       PasswordLength = _PASSWORD_LEN,
> -
> -     DES_Len = 13,
> -
>       LowGid = DEF_LOWUID,
>       HighGid = DEF_HIGHUID
>  };
> @@ -855,51 +852,6 @@ getnextuid(int sync_uid_gid, uid_t *uid,
>       return 0;
>  }
>  
> -/* structure which defines a password type */
> -typedef struct passwd_type_t {
> -     const char     *type;           /* optional type descriptor */
> -     int             desc_length;    /* length of type descriptor */
> -     int             length;         /* length of password */
> -} passwd_type_t;
> -
> -#define NBLF "$2b"
> -#define BLF  "$2a"
> -#define MD5  "$1"
> -#define DES  ""
> -
> -static passwd_type_t passwd_types[] = {
> -     { NBLF, 3,      54      },      /* Blowfish bcrypt version 2b */
> -     { BLF,  3,      54      },      /* Blowfish */
> -     { MD5,  2,      34      },      /* MD5 */
> -     { DES,  0,      DES_Len },      /* standard DES */
> -     { NULL, -1,     -1      }       /* none - terminate search */
> -};
> -
> -/* return non-zero if it's a valid password - check length for cipher type *
> /
> -static int
> -valid_password_length(char *newpasswd)
> -{
> -     passwd_type_t  *pwtp;
> -
> -     for (pwtp = passwd_types ; pwtp->desc_length >= 0 ; pwtp++) {
> -             if (strncmp(newpasswd, pwtp->type, pwtp->desc_length) == 0) {
> -                     char *p;
> -
> -                     if (strcmp(pwtp->type, BLF) != 0 &&
> -                         strcmp(pwtp->type, NBLF) != 0) {
> -                             return strlen(newpasswd) == pwtp->length;
> -                     }
> -                     /* Skip first three `$'. */
> -                     if ((p = strchr(newpasswd, '$')) == NULL ||
> -                         *(++p) == '$' || (p = strchr(p, '$')) == NULL ||
> -                         *(++p) == '$' || (p = strchr(p, '$')) == NULL)
> -                             continue;
> -                     return (strlen(p) - 1);
> -             }
> -     }
> -     return 0;
> -}
> -
>  /* look for a valid time, return 0 if it was specified but bad */
>  static int
>  scantime(time_t *tp, char *s)
> @@ -1130,16 +1082,8 @@ adduser(char *login_name, user_t *up)
>               warnx("Warning: home directory `%s' doesn't exist, and -m was"
>                   " not specified", home);
>       }
> -     if (up->u_password != NULL && valid_password_length(up->u_password)) {
> -             (void) strlcpy(password, up->u_password, sizeof(password));
> -     } else {
> -             (void) memset(password, '*', DES_Len);
> -             password[DES_Len] = 0;
> -             if (up->u_password != NULL) {
> -                     warnx("Password `%s' is invalid: setting it to `%s'",
> -                             up->u_password, password);
> -             }
> -     }
> +     (void) strlcpy(password, up->u_password ? up->u_password : "*",
> +         sizeof(password));
>       cc = snprintf(buf, sizeof(buf), "%s:%s:%u:%u:%s:%lld:%lld:%s:%s:%s\n",
>           login_name,
>           password,
> @@ -1476,15 +1420,8 @@ moduser(char *login_name, char *newlogin
>                       }
>               }
>               if (up->u_flags & F_PASSWORD) {
> -                     if (up->u_password != NULL) {
> -                             if (!valid_password_length(up->u_password)) {
> -                                     (void) close(ptmpfd);
> -                                     pw_abort();
> -                                     errx(EXIT_FAILURE, "Invalid password: `
> %s'",
> -                                             up->u_password);
> -                             }
> +                     if (up->u_password != NULL)
>                               pwp->pw_passwd = up->u_password;
> -                     }
>               }
>               if (up->u_flags & F_ACCTLOCK) {
>                       /* lock the account */
> @@ -2028,7 +1965,6 @@ userdel(int argc, char **argv)
>  {
>       struct passwd   *pwp;
>       user_t          u;
> -     char            password[PasswordLength + 1];
>       int             defaultfield;
>       int             rmhome;
>       int             bigD;
> @@ -2086,9 +2022,7 @@ userdel(int argc, char **argv)
>       if (u.u_preserve) {
>               u.u_flags |= F_SHELL;
>               memsave(&u.u_shell, NOLOGIN, strlen(NOLOGIN));
> -             (void) memset(password, '*', DES_Len);
> -             password[DES_Len] = 0;
> -             memsave(&u.u_password, password, strlen(password));
> +             memsave(&u.u_password, "*", strlen("*"));
>               u.u_flags |= F_PASSWORD;
>               openlog("userdel", LOG_PID, LOG_USER);
>               return moduser(*argv, *argv, &u) ? EXIT_SUCCESS : EXIT_FAILURE;
> 

Reply via email to