]> git.cameronkatri.com Git - pw-darwin.git/blobdiff - pw/pw_user.c
Revert r277652
[pw-darwin.git] / pw / pw_user.c
index 4b3f55007f6b6ec3785df203f6005c17b9a7519d..483148af4909d2c6170b9024b353d72595d22200 100644 (file)
@@ -321,6 +321,9 @@ pw_user(struct userconf * cnf, int mode, struct cargs * args)
                        (a_uid = a_name)->ch = 'u';
                        a_name = NULL;
                }
+       } else {
+               if (strspn(a_uid->val, "0123456789") != strlen(a_uid->val))
+                       errx(EX_USAGE, "-u expects a number");
        }
 
        /*
@@ -438,14 +441,13 @@ pw_user(struct userconf * cnf, int mode, struct cargs * args)
                                delgrent(GETGRNAM(a_name->val));
                        SETGRENT();
                        while ((grp = GETGRENT()) != NULL) {
-                               int i;
+                               int i, j;
                                char group[MAXLOGNAME];
                                if (grp->gr_mem != NULL) {
                                        for (i = 0; grp->gr_mem[i] != NULL; i++) {
                                                if (!strcmp(grp->gr_mem[i], a_name->val)) {
-                                                       while (grp->gr_mem[i] != NULL) {
-                                                               grp->gr_mem[i] = grp->gr_mem[i+1];
-                                                       }       
+                                                       for (j = i; grp->gr_mem[j] != NULL; j++)
+                                                               grp->gr_mem[j] = grp->gr_mem[j+1];
                                                        strlcpy(group, grp->gr_name, MAXLOGNAME);
                                                        chggrent(group, grp);
                                                }
@@ -616,7 +618,7 @@ pw_user(struct userconf * cnf, int mode, struct cargs * args)
                pwd->pw_dir = pw_homepolicy(cnf, args, pwd->pw_name);
                pwd->pw_shell = pw_shellpolicy(cnf, args, NULL);
                lc = login_getpwclass(pwd);
-               if (lc == NULL || login_setcryptfmt(lc, "md5", NULL) == NULL)
+               if (lc == NULL || login_setcryptfmt(lc, "sha512", NULL) == NULL)
                        warn("setting crypt(3) format");
                login_close(lc);
                pwd->pw_passwd = pw_password(cnf, args, pwd->pw_name);
@@ -691,7 +693,7 @@ pw_user(struct userconf * cnf, int mode, struct cargs * args)
                        } else {
                                lc = login_getpwclass(pwd);
                                if (lc == NULL ||
-                                   login_setcryptfmt(lc, "md5", NULL) == NULL)
+                                   login_setcryptfmt(lc, "sha512", NULL) == NULL)
                                        warn("setting crypt(3) format");
                                login_close(lc);
                                pwd->pw_passwd = pw_pwcrypt(line);
@@ -752,7 +754,25 @@ pw_user(struct userconf * cnf, int mode, struct cargs * args)
         */
 
        if (mode == M_ADD || getarg(args, 'G') != NULL) {
-               int i;
+               int i, j;
+               /* First remove the user from all group */
+               SETGRENT();
+               while ((grp = GETGRENT()) != NULL) {
+                       char group[MAXLOGNAME];
+                       if (grp->gr_mem == NULL)
+                               continue;
+                       for (i = 0; grp->gr_mem[i] != NULL; i++) {
+                               if (strcmp(grp->gr_mem[i] , pwd->pw_name) != 0)
+                                       continue;
+                               for (j = i; grp->gr_mem[j] != NULL ; j++)
+                                       grp->gr_mem[j] = grp->gr_mem[j+1];
+                               strlcpy(group, grp->gr_name, MAXLOGNAME);
+                               chggrent(group, grp);
+                       }
+               }
+               ENDGRENT();
+
+               /* now add to group where needed */
                for (i = 0; cnf->groups[i] != NULL; i++) {
                        grp = GETGRNAM(cnf->groups[i]);
                        grp = gr_add(grp, pwd->pw_name);