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

📄 password.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
/* password.c */#include <u.h>#include <libc.h>#include <bio.h>#include <mp.h>#include <libsec.h>#include "SConn.h"#include "secstore.h"static Biobuf*openPW(char *id, int mode){	Biobuf *b;	int nfn = strlen(SECSTORE_DIR)+strlen(id)+20;	char *fn;	if(validatefile(id) == nil || strcmp(id,".") == 0)		return nil;	fn = emalloc(nfn);	snprint(fn, nfn, "%s/who/%s", SECSTORE_DIR, id);	b = Bopen(fn, mode);	free(fn);	return b;}static ulongmtimePW(char *id){	Dir *d;	int nfn = strlen(SECSTORE_DIR)+strlen(id)+20;	char *fn = emalloc(nfn);	ulong mt;	snprint(fn, nfn, "%s/who/%s", SECSTORE_DIR, id);	d = dirstat(fn);	free(fn);	mt = d->mtime;	free(d);	return mt;}PW *getPW(char *id, int dead_or_alive){	uint now = time(0);	Biobuf *bin;	PW *pw;	char *f1, *f2; // fields 1, 2 = attribute, value	if((bin = openPW(id, OREAD)) == 0){		id = "FICTITIOUS";		if((bin = openPW(id, OREAD)) == 0){			werrstr("account does not exist");			return nil;		}	}	pw = emalloc(sizeof(*pw));	pw->id = estrdup(id);	pw->status |= Enabled;	while( (f1 = Brdline(bin, '\n')) != 0){		f1[Blinelen(bin)-1] = 0;		for(f2 = f1; *f2 && (*f2!=' ') && (*f2!='\t'); f2++){}		if(*f2)			for(*f2++ = 0; *f2 && (*f2==' ' || *f2=='\t'); f2++){}		if(strcmp(f1, "exp") == 0){			pw->expire = strtoul(f2, 0, 10);		}else if(strcmp(f1, "DISABLED") == 0){			pw->status &= ~Enabled;		}else if(strcmp(f1, "STA") == 0){			pw->status |= STA;		}else if(strcmp(f1, "failed") == 0){			pw->failed = strtoul(f2, 0, 10);		}else if(strcmp(f1, "other") == 0){			pw->other = estrdup(f2);		}else if(strcmp(f1, "PAK-Hi") == 0){			pw->Hi = strtomp(f2, nil, 64, nil);		}	}	Bterm(bin);	if(pw->Hi == nil){		werrstr("corrupted account file");		freePW(pw);		return nil;	}	if(dead_or_alive)		return pw;  // return PW entry for editing, whether currently valid or not	if(pw->expire <= now){		werrstr("account expired");		freePW(pw);		return nil;	}	if((pw->status & Enabled) == 0){		werrstr("account disabled");		freePW(pw);		return nil;	}	if(pw->failed < 10)		return pw;  // success	if(now < mtimePW(id)+300){		werrstr("too many failures; try again in five minutes");		freePW(pw);		return nil;	}	pw->failed = 0;	putPW(pw);  // reset failed-login-counter after five minutes	return pw;}intputPW(PW *pw){	Biobuf *bout;	char *hexHi;	if((bout = openPW(pw->id, OWRITE|OTRUNC)) ==0){		werrstr("can't open PW file");		return -1;	}	Bprint(bout, "exp	%lud\n", pw->expire);	if(!(pw->status & Enabled))		Bprint(bout, "DISABLED\n");	if(pw->status & STA)		Bprint(bout, "STA\n");	if(pw->failed)		Bprint(bout, "failed\t%d\n", pw->failed);	if(pw->other)		Bprint(bout,"other\t%s\n", pw->other);	hexHi = mptoa(pw->Hi, 64, nil, 0);	Bprint(bout, "PAK-Hi\t%s\n", hexHi);	free(hexHi);	return 0;}voidfreePW(PW *pw){	if(pw == nil)		return;	free(pw->id);	free(pw->other);	mpfree(pw->Hi);	free(pw);}

⌨️ 快捷键说明

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