]>
git.saurik.com Git - apple/system_cmds.git/blob - passwd.tproj/passwd.c
3d2b19d063c1e8c1a13a10600b80aa4f87d8e694
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
8 * This file contains Original Code and/or Modifications of Original Code
9 * as defined in and that are subject to the Apple Public Source License
10 * Version 2.0 (the 'License'). You may not use this file except in
11 * compliance with the License. Please obtain a copy of the License at
12 * http://www.opensource.apple.com/apsl/ and read it before using this
15 * The Original Code and all software distributed under the License are
16 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
17 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
18 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
20 * Please see the License for the specific language governing rights and
21 * limitations under the License.
23 * @APPLE_LICENSE_HEADER_END@
25 #define INFO_NETINFO 0
28 #define INFO_DIRECTORYSERVICES 3
31 #define _PASSWD_FILE "/etc/master.passwd"
33 #define _PASSWD_FILE "/etc/passwd"
42 #include <netinfo/ni.h>
43 #include "stringops.h"
46 #define _PASSWORD_LEN 8
49 static char *saltchars
= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./";
51 extern int file_passwd(char *, char *);
52 extern int netinfo_passwd(char *, char *);
53 extern int nis_passwd(char *, char *);
54 extern int ds_passwd(char *, char *);
57 getpasswd(char *name
, int isroot
, int minlen
, int mixcase
, int nonalpha
,
58 char *old_pw
, char **new_pw
, char **old_clear
, char **new_clear
)
60 int i
, tries
, len
, pw_ok
, upper
, lower
, alpha
, notalpha
;
63 static char obuf
[_PASSWORD_LEN
+1];
64 static char nbuf
[_PASSWORD_LEN
+1];
67 printf("Changing password for %s.\n", name
);
71 if (old_pw
== NULL
) isNull
= 1;
72 if ((isNull
== 0) && (old_pw
[0] == '\0')) isNull
= 1;
73 if ((isroot
== 0) && (isNull
== 0))
75 p
= getpass("Old password:");
76 if (strcmp(crypt(p
, old_pw
), old_pw
))
79 fprintf(stderr
, "Sorry\n");
84 snprintf( obuf
, sizeof(obuf
), "%s", p
);
90 p
= getpass("New password:");
93 printf("Password unchanged.\n");
103 for (i
= 0; i
< len
; i
++)
105 if (isupper(p
[i
])) upper
++;
106 if (islower(p
[i
])) lower
++;
107 if (isalpha(p
[i
])) alpha
++;
113 if (len
< minlen
) pw_ok
= 0;
114 if ((mixcase
== 1) && ((upper
== 0) || (lower
== 0))) pw_ok
= 0;
115 if ((nonalpha
== 1) && (notalpha
== 0)) pw_ok
= 0;
118 * An insistent root may override security options.
120 if ((isroot
== 1) && (tries
> 2)) pw_ok
= 1;
123 * A very insistent user may override security options.
125 if (tries
> 4) pw_ok
= 1;
130 printf("Password must be at least %d characters long.\n", minlen
);
131 if ((mixcase
== 1) && ((upper
== 0) || (lower
== 0)))
132 printf("Password must contain both upper and lower case characters.\n");
133 if ((nonalpha
== 1) && (notalpha
== 0))
134 printf("Password must contain non-alphabetic characters.\n");
139 snprintf( nbuf
, sizeof(nbuf
), "%s", p
);
141 if (!strcmp(nbuf
, getpass("Retype new password:"))) break;
143 printf("Mismatch; try again, EOF to quit.\n");
147 * Create a random salt
149 srandom((int)time((time_t *)NULL
));
150 salt
[0] = saltchars
[random() % strlen(saltchars
)];
151 salt
[1] = saltchars
[random() % strlen(saltchars
)];
153 *new_pw
= crypt(nbuf
, salt
);
163 fprintf(stderr
, "usage: passwd [-i infosystem] [-l location] [name]\n");
164 fprintf(stderr
, "supported infosystems are:\n");
165 fprintf(stderr
, " netinfo\n");
166 fprintf(stderr
, " file\n");
167 fprintf(stderr
, " nis\n");
168 fprintf(stderr
, " opendirectory\n");
169 fprintf(stderr
, "for netinfo, location may be a domain name or server/tag\n");
170 fprintf(stderr
, "for file, location may be a file name (%s is the default)\n",
172 fprintf(stderr
, "for nis, location may be a NIS domainname\n");
173 fprintf(stderr
, "for opendirectory, location may be a directory node name\n");
178 main(int argc
, char *argv
[])
183 /* since DS works for most infosystems, make it the default */
184 //infosystem = INFO_NETINFO;
185 infosystem
= INFO_DIRECTORYSERVICES
;
189 for (i
= 1; i
< argc
; i
++)
191 if (!strcmp(argv
[i
], "-i"))
195 fprintf(stderr
, "no argument for -i option\n");
199 if (!strcmp(argv
[i
], "NetInfo")) infosystem
= INFO_NETINFO
;
200 else if (!strcmp(argv
[i
], "netinfo")) infosystem
= INFO_NETINFO
;
201 else if (!strcmp(argv
[i
], "File")) infosystem
= INFO_FILE
;
202 else if (!strcmp(argv
[i
], "file")) infosystem
= INFO_FILE
;
203 else if (!strcmp(argv
[i
], "NIS")) infosystem
= INFO_NIS
;
204 else if (!strcmp(argv
[i
], "nis")) infosystem
= INFO_NIS
;
205 else if (!strcmp(argv
[i
], "YP")) infosystem
= INFO_NIS
;
206 else if (!strcmp(argv
[i
], "yp")) infosystem
= INFO_NIS
;
207 else if (!strcasecmp(argv
[i
], "opendirectory")) infosystem
= INFO_DIRECTORYSERVICES
;
210 fprintf(stderr
, "unknown info system \"%s\"\n", argv
[i
]);
215 else if (!strcmp(argv
[i
], "-l"))
219 fprintf(stderr
, "no argument for -l option\n");
224 else if (user
== NULL
) user
= argv
[i
];
231 * Verify that the login name exists.
234 if ((user
= getlogin()) == NULL
)
236 fprintf(stderr
, "you don't have a login name\n");
244 netinfo_passwd(user
, locn
);
247 file_passwd(user
, locn
);
250 nis_passwd(user
, locn
);
252 case INFO_DIRECTORYSERVICES
:
253 ds_passwd(user
, locn
);