|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 6714 (0x1a3a)
Types: TextFile
Names: »pw_userinfo.c«
└─⟦4f9d7c866⟧ Bits:30007245 EUUGD6: Sikkerheds distributionen
└─⟦123909933⟧ »./npasswd/npasswd.tar.Z«
└─⟦22a202e7d⟧
└─⟦this⟧ »npass-new/npasswd_jpl/pw_userinfo.c«
/* -------------------------------------------------------------------- */
/* */
/* Author: Clyde Hoover */
/* Computation Center */
/* The University of Texas at Austin */
/* Austin, Texas 78712 */
/* clyde@emx.utexas.edu */
/* uunet!cs.utexas.edu!ut-emx!clyde */
/* */
/*This code may be distributed freely, provided this notice is retained. */
/* */
/* -------------------------------------------------------------------- */
/*
* pw_userinfo.c - UTEXAS CC UNIX User Information Data Base
* backend for npasswd
*/
#ifndef lint
static char sccsid[] = "@(#)pw_userinfo.c 1.4 8/7/90 (cc.utexas.edu) /tmp_mnt/usr/share/src/private/ut/share/bin/passwd/SCCS/s.pw_userinfo.c";
#endif
#include <stdio.h>
#include <errno.h>
#include <syslog.h>
#include <strings.h>
#include <signal.h>
#include <pwd.h>
#include <local/userinfo.h>
static userdata theUser, /* User having password changed */
Me; /* User doing password change */
#define P_USER 1
#define P_PRIV 2
#define P_SU 3
static short priv = P_USER; /* Privlege level of <Me> */
#define QUOTEC '"' /* Character to start plaintext pwd */
#define XPWLEN 3 /* Length of 'original CDC password' */
extern char *getlogin(),
*crypt(),
*index(),
*rindex();
/*
* pw_initialize - set up
*/
pw_initialize()
{
char *myname = getlogin(); /* Login name */
struct passwd *pw; /* If getlogin() fails... */
userptr u; /* Temp */
if (myname == NULL || *myname == '\0') {
if ((pw = getpwuid(getuid())) == ((struct passwd *)NULL))
quit(1, "Cannot get user name.\n");
else
myname = pw->pw_name;
}
bzero((char *)&theUser, sizeof(theUser));
bzero((char *)&Me, sizeof(Me));
if ((u = getuserbyname(myname)) == NULL)
quit(1, "Cannot get user identification.\n");
Me = *u;
if (Me.ui_priv.p_acct_maint) /* Account maintenance priv? */
priv = P_PRIV;
if (getuid() == 0) /* SuperUser? */
priv = P_SU;
}
/*
* pw_getuserbyname - Get userinfo data by name
*
* Returns 1 if passwd info found for <name>
* 0 otherwise
*/
pw_getuserbyname(name, passwdb)
char *name, /* Login name */
*passwdb; /* Where to stash password */
{
userptr u; /* Temp */
if ((u = getuserbyname(name)) == NULL)
return(0);
theUser = *u;
(void) strcpy(passwdb, theUser.ui_password);
return(1);
}
/*
* pw_permission - check if this user can change this password
*/
pw_permission()
{
int mypasswd /* Wanting to change own password? */
= (theUser.ui_uid == Me.ui_uid);
/*
* Must be su to change root password.
*/
if (theUser.ui_uid == 0 && priv != P_SU) {
fprintf(stderr, "Permission denied.\n");
return(0);
}
/*
* Must be su or have 'account maintenace' capability to change
* someone else's password.
*/
if (!mypasswd && priv < P_PRIV) {
fprintf(stderr, "Permission denied.\n");
return(0);
}
/*
* If 'password change' capability denied, then user cannot
* change their own password.
*/
if (theUser.ui_priv.p_nopwchange && mypasswd) {
fprintf(stderr, "Permission denied.\n");
return(0);
}
/*
* We know at this point that the
* invoker does have permission to change the password.
*/
return(1);
}
/*
* pw_compare - compare old and new passwords
*
* Returns 1 if check = new, 0 if not
*/
pw_compare(current, check)
char *current,
*check;
{
if (!*current)
return(1);
return(strcmp(current, crypt(check, current)) == 0);
}
/*
* pw_check - sanity check password. Performs some site-specific
* checks, then calls the checkpasswd() code.
*
* Returns 1 if password is ok to use, 0 otherwise
*/
pw_check(new)
char *new; /* New password (plaintext) */
{
/* Setting null password? */
if (strcmp(new, "@") == 0) {
if (theUser.ui_priv.p_null_pass == 0 || priv < P_PRIV) {
fprintf(stderr, "Cannot set null password.\n");
return(0);
}
else
return(1);
}
/* A plain text password (enclosed in ""s)? */
if (*new == QUOTEC) {
char *p = &new[1];
while (*p) p++;
if (p[-1] == QUOTEC) {
if (priv == P_SU) /* Reserved for superuser */
return(1);
else {
fprintf(stderr,
"Cannot set plaintext password.\n");
return(0);
}
}
}
/* Special password (reserved for superuser) */
if (strlen(new) == XPWLEN && priv == P_SU)
return(1);
/* Dispatch to general password checker */
return(checkpasswd(theUser.ui_uid, new));
}
/*
* pw_replace - Replace password in Userinfo database
*/
pw_replace(new, current)
char *new, /* New password (plaintext) */
*current; /* Current password (plaintext) [unused] */
{
userptr newu; /* Temp */
int rc; /* Temp */
long oldsigs, /* Saved signal mask */
blockedsigs = sigmask(SIGINT) | /* Signals to block */
sigmask(SIGQUIT) | /* while updating */
sigmask(SIGTSTP); /* the database */
extern int errno;
/*
* Password has already been validated by pw_check()
*/
if ((newu = getuserbyuid(theUser.ui_uid)) == NULL)
quit(1, "pw_replace: Cannot refetch user information.\n");
if (strcmp(new, "@") == 0) {
printf("Password removed from %s\n", theUser.ui_name);
#ifndef DEBUG
syslog(LOG_INFO, "Password removed from %s\n", theUser.ui_name);
#endif
newu->ui_password[0] = 0;
}
else {
char salt[2];
randomstring(salt, sizeof(salt));
(void) strcpy(newu->ui_password, crypt(new, salt));
if (*new == QUOTEC && priv == P_SU) {
char *p = new;
while (*p) p++;
if (*--p == QUOTEC) {
*p = 0;
(void) strcpy(newu->ui_password, &new[1]);
printf("Setting plain text password.\n");
}
}
}
ui_acct(newu)->a_pwchanged = time((time_t *)0);
#if 0
if (UIRecordChanged(newu))
quit(1, "Record synchronization error\n");
#endif
#ifdef DEBUG
printf("replace %s %s\n", theUser.ui_password, newu->ui_password);
#else
errno = 0;
oldsigs = sigblock(blockedsigs);
if (lockuser(theUser.ui_uid) < 0) {
if (errno == ETXTBSY)
quit(1,
"pw_replace: Data for %s locked out.\n",
theUser.ui_name);
else
quit(1,
"pw_replace: Data lock failure for user %s\n",
theUser.ui_name);
}
rc = UIReplaceEntry(newu);
(void) sigsetmask(oldsigs);
unlockuser(theUser.ui_uid);
if (rc < 0)
quit(1, "Userinfo update failure %s\n", UIErrorMessage);
#endif
}
/*
* pw_cleanup - cleanup routine
*/
pw_cleanup()
{
/* Do nothing */
}
/* End pw_userinfo.c */