diff options
| author | Bill Paul <wpaul@FreeBSD.org> | 1996-05-31 14:47:45 +0000 |
|---|---|---|
| committer | Bill Paul <wpaul@FreeBSD.org> | 1996-05-31 14:47:45 +0000 |
| commit | d2862cf2f9c3ca8aed0b6901ed9a607f516b9fe5 (patch) | |
| tree | 971141a58bb0d36068b5da77e05dc9af4ce37360 | |
| parent | 8728e9a57f5e540a22baaadb8da75408fcd545a9 (diff) | |
Notes
| -rw-r--r-- | gnu/usr.sbin/yppasswdd/update.c | 70 | ||||
| -rw-r--r-- | gnu/usr.sbin/yppasswdd/yppasswdd.c | 9 |
2 files changed, 78 insertions, 1 deletions
diff --git a/gnu/usr.sbin/yppasswdd/update.c b/gnu/usr.sbin/yppasswdd/update.c index a8b4f2003b57..1ee4aeb10223 100644 --- a/gnu/usr.sbin/yppasswdd/update.c +++ b/gnu/usr.sbin/yppasswdd/update.c @@ -27,6 +27,9 @@ #include <rpc/pmap_clnt.h> #include "yppasswd.h" +#include <rpcsvc/yp_prot.h> +#include <rpcsvc/ypclnt.h> + char *tempname, *passfile; extern int *allow_chfn, *allow_chsh; extern int pid; @@ -34,11 +37,63 @@ extern int pw_copy __P((int, int, struct passwd *)); extern int pw_lock __P((void)); extern int pw_mkdb __P((void)); extern int pw_tmp __P((void)); +extern char *domain; +static struct passwd yp_password; #define xprt_addr(xprt) (svc_getcaller(xprt)->sin_addr) #define xprt_port(xprt) ntohs(svc_getcaller(xprt)->sin_port) void reaper( int sig ); +static void copy_yp_pass(p, x, m) + char *p; + int x, m; +{ + register char *t, *s = p; + static char *buf; + + yp_password.pw_fields = 0; + + buf = (char *)realloc(buf, m + 10); + bzero(buf, m + 10); + + /* Turn all colons into NULLs */ + while (strchr(s, ':')) { + s = (strchr(s, ':') + 1); + *(s - 1)= '\0'; + } + + t = buf; +#define EXPAND(e) e = t; while ((*t++ = *p++)); + EXPAND(yp_password.pw_name); + yp_password.pw_fields |= _PWF_NAME; + EXPAND(yp_password.pw_passwd); + yp_password.pw_fields |= _PWF_PASSWD; + yp_password.pw_uid = atoi(p); + p += (strlen(p) + 1); + yp_password.pw_fields |= _PWF_UID; + yp_password.pw_gid = atoi(p); + p += (strlen(p) + 1); + yp_password.pw_fields |= _PWF_GID; + if (x) { + EXPAND(yp_password.pw_class); + yp_password.pw_fields |= _PWF_CLASS; + yp_password.pw_change = atol(p); + p += (strlen(p) + 1); + yp_password.pw_fields |= _PWF_CHANGE; + yp_password.pw_expire = atol(p); + p += (strlen(p) + 1); + yp_password.pw_fields |= _PWF_EXPIRE; + } + EXPAND(yp_password.pw_gecos); + yp_password.pw_fields |= _PWF_GECOS; + EXPAND(yp_password.pw_dir); + yp_password.pw_fields |= _PWF_DIR; + EXPAND(yp_password.pw_shell); + yp_password.pw_fields |= _PWF_SHELL; + + return; +} + /*===============================================================* * Argument validation. Avoid \n... (ouch). * We can't use isprint, because people may use 8bit chars which @@ -78,6 +133,8 @@ yppasswdproc_pwupdate_1(yppasswd *yppw, struct svc_req *rqstp) int pfd, tfd; char *passfile_hold; char template[] = "/tmp/yppwtmp.XXXXX"; + char *result; + int resultlen; newpw = &yppw->newpw; res = 1; @@ -96,11 +153,24 @@ yppasswdproc_pwupdate_1(yppasswd *yppw, struct svc_req *rqstp) /* Check if the user exists */ + if (yp_match(domain, "master.passwd.byname", yppw->newpw.pw_name, + strlen(yppw->newpw.pw_name), &result, &resultlen)) { + syslog ( LOG_WARNING, "%s failed", logbuf ); + syslog ( LOG_WARNING, "User not in password file." ); + return (&res); + } else { + copy_yp_pass(result, 1, resultlen); + pw = (struct passwd *)&yp_password; + free(result); + } + +#ifdef notdef if (!(pw = getpwnam(yppw->newpw.pw_name))) { syslog ( LOG_WARNING, "%s failed", logbuf ); syslog ( LOG_WARNING, "User not in password file." ); return (&res); } +#endif /* Check the password. */ diff --git a/gnu/usr.sbin/yppasswdd/yppasswdd.c b/gnu/usr.sbin/yppasswdd/yppasswdd.c index b69333ea95b5..505db24af824 100644 --- a/gnu/usr.sbin/yppasswdd/yppasswdd.c +++ b/gnu/usr.sbin/yppasswdd/yppasswdd.c @@ -29,9 +29,10 @@ extern char *optarg; extern void pw_init __P((void)); static char *program_name = ""; -static char *version = "yppsswdd " VERSION; +static char *version = "yppasswdd " VERSION; char *passfile = _PATH_MASTERPASSWD; int allow_chfn = 0, allow_chsh = 0; +char *domain; #define xprt_addr(xprt) (svc_getcaller(xprt)->sin_addr) #define xprt_port(xprt) ntohs(svc_getcaller(xprt)->sin_port) @@ -160,6 +161,12 @@ main(int argc, char **argv) exit(1); } + if (yp_get_default_domain(&domain)) { + fprintf(stderr, "%s: NIS domain name not set -- aborting\n", + program_name); + exit(1); + } + /* * We can call this here since it does some necessary setup * for us (blocking signals, setting resourse limits, etc. |
