⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 in_tkt.c

📁 早期freebsd实现
💻 C
字号:
/* * $Source: /usr/src/kerberosIV/krb/RCS/in_tkt.c,v $ * $Author: karels $ * * Copyright 1985, 1986, 1987, 1988 by the Massachusetts Institute * of Technology. * * For copying and distribution information, please see the file * <mit-copyright.h>. */#ifndef lintstatic char *rcsid_in_tkt_c ="$Id: in_tkt.c,v 4.13 91/07/05 16:39:32 karels Exp $";#endif /* lint */#include <mit-copyright.h>#include <stdio.h>#include <des.h>#include <krb.h>#include <sys/file.h>#include <sys/param.h>#include <sys/stat.h>#ifdef TKT_SHMEM#include <sys/param.h>#endifextern int krb_debug;/* * in_tkt() is used to initialize the ticket store.  It creates the * file to contain the tickets and writes the given user's name "pname" * and instance "pinst" in the file.  in_tkt() returns KSUCCESS on * success, or KFAILURE if something goes wrong. */in_tkt(pname,pinst)    char *pname;    char *pinst;{    int tktfile;    uid_t me, metoo, getuid(), geteuid();    struct stat buf;    int count;    char *file = TKT_FILE;    int fd, remove = 0;    register int i;    char charbuf[BUFSIZ];#ifdef TKT_SHMEM    char shmidname[MAXPATHLEN];#endif /* TKT_SHMEM */    me = getuid();    metoo = geteuid();    if (lstat(file,&buf) == 0) {	/*	 * If called by root to set up ticket file for other user,	 * don't bitch, just zap the file; login/su run as root	 * until after authentication succeeds.	 */	if (buf.st_uid != me && me == 0) {		remove = 1;		buf.st_uid = me;	}	if (buf.st_uid != me || (buf.st_mode & S_IFMT) != S_IFREG ||	    buf.st_mode & 077) {	    if (krb_debug)		fprintf(stderr,"%s exists, wrong owner/mode",file);	    return(KFAILURE);	}	/* file already exists, and permissions appear ok, so nuke it */	if ((fd = open(file, O_RDWR, 0)) < 0)	    goto out; /* can't zero it, but we can still try truncating it */	bzero(charbuf, sizeof(charbuf));	for (i = 0; i < buf.st_size; i += sizeof(charbuf))	    if (write(fd, charbuf, sizeof(charbuf)) != sizeof(charbuf))		break;		(void) fsync(fd);	(void) close(fd);	if (remove)		(void) unlink(file);    } out:    /* arrange so the file is owned by the ruid       (seteuid or swap real & effective uid if necessary).       This isn't a security problem, since the ticket file, if it already       exists, has the right uid (== ruid) and mode. */    /* THIS IS HIGHLY QUESTIONABLE, though, as the current uid is probably       wrong; this is done from login or su, which are doing this before       adopting the new ID (we're called during the initial authentication). */    if (me != metoo) {#if defined(BSD) && BSD >= 199006	if (seteuid(me) < 0) {	    if (krb_debug)		perror("in_tkt: seteuid");	    return(KFAILURE);	} else	    if (krb_debug)		printf("switched euid %d to %d\n",metoo,me);#else	if (setreuid(metoo, me) < 0) {	    /* can't switch??? barf! */	    if (krb_debug)		perror("in_tkt: setreuid");	    return(KFAILURE);	} else	    if (krb_debug)		printf("swapped UID's %d and %d\n",metoo,me);#endif    }    if ((tktfile = creat(file,0600)) < 0) {	if (krb_debug)	    fprintf(stderr,"Error initializing %s",TKT_FILE);        return(KFAILURE);    }    if (me != metoo) {#if defined(BSD) && BSD >= 199006	if (seteuid(metoo) < 0) {	    if (krb_debug)		perror("in_tkt: seteuid2");	    return(KFAILURE);	} else	    if (krb_debug)		printf("switched euid back to %d\n",metoo);#else	if (setreuid(me, metoo) < 0) {	    /* can't switch??? barf! */	    if (krb_debug)		perror("in_tkt: setreuid2");	    return(KFAILURE);	} else	    if (krb_debug)		printf("swapped UID's %d and %d\n",me,metoo);#endif    }    if (fstat(tktfile,&buf) < 0) {	if (krb_debug)	    fprintf(stderr,"Error initializing %s",TKT_FILE);        return(KFAILURE);    }    if (buf.st_uid != me || (buf.st_mode & S_IFMT) != S_IFREG ||        buf.st_mode & 077) {	if (krb_debug)	    fprintf(stderr,"Error initializing %s",TKT_FILE);        return(KFAILURE);    }    count = strlen(pname)+1;    if (write(tktfile,pname,count) != count) {        (void) close(tktfile);        return(KFAILURE);    }    count = strlen(pinst)+1;    if (write(tktfile,pinst,count) != count) {        (void) close(tktfile);        return(KFAILURE);    }    (void) close(tktfile);#ifdef TKT_SHMEM    (void) strcpy(shmidname, file);    (void) strcat(shmidname, ".shm");    return(krb_shm_create(shmidname));#else /* !TKT_SHMEM */    return(KSUCCESS);#endif /* TKT_SHMEM */}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -