Blame


1 6e527fbc 2005-02-13 devnull /* password.c */
2 6e527fbc 2005-02-13 devnull #include <u.h>
3 6e527fbc 2005-02-13 devnull #include <libc.h>
4 6e527fbc 2005-02-13 devnull #include <bio.h>
5 6e527fbc 2005-02-13 devnull #include <mp.h>
6 6e527fbc 2005-02-13 devnull #include <libsec.h>
7 6e527fbc 2005-02-13 devnull #include "SConn.h"
8 6e527fbc 2005-02-13 devnull #include "secstore.h"
9 6e527fbc 2005-02-13 devnull
10 6e527fbc 2005-02-13 devnull static Biobuf*
11 6e527fbc 2005-02-13 devnull openPW(char *id, int mode)
12 6e527fbc 2005-02-13 devnull {
13 6e527fbc 2005-02-13 devnull Biobuf *b;
14 6e527fbc 2005-02-13 devnull int nfn = strlen(SECSTORE_DIR)+strlen(id)+20;
15 6e527fbc 2005-02-13 devnull char *fn = emalloc(nfn);
16 6e527fbc 2005-02-13 devnull
17 6e527fbc 2005-02-13 devnull snprint(fn, nfn, "%s/who/%s", SECSTORE_DIR, id);
18 6e527fbc 2005-02-13 devnull b = Bopen(fn, mode);
19 6e527fbc 2005-02-13 devnull free(fn);
20 6e527fbc 2005-02-13 devnull return b;
21 6e527fbc 2005-02-13 devnull }
22 6e527fbc 2005-02-13 devnull
23 6e527fbc 2005-02-13 devnull static ulong
24 6e527fbc 2005-02-13 devnull mtimePW(char *id)
25 6e527fbc 2005-02-13 devnull {
26 6e527fbc 2005-02-13 devnull Dir *d;
27 6e527fbc 2005-02-13 devnull int nfn = strlen(SECSTORE_DIR)+strlen(id)+20;
28 6e527fbc 2005-02-13 devnull char *fn = emalloc(nfn);
29 6e527fbc 2005-02-13 devnull ulong mt;
30 6e527fbc 2005-02-13 devnull
31 6e527fbc 2005-02-13 devnull snprint(fn, nfn, "%s/who/%s", SECSTORE_DIR, id);
32 6e527fbc 2005-02-13 devnull d = dirstat(fn);
33 6e527fbc 2005-02-13 devnull free(fn);
34 6e527fbc 2005-02-13 devnull mt = d->mtime;
35 6e527fbc 2005-02-13 devnull free(d);
36 6e527fbc 2005-02-13 devnull return mt;
37 6e527fbc 2005-02-13 devnull }
38 6e527fbc 2005-02-13 devnull
39 6e527fbc 2005-02-13 devnull PW *
40 6e527fbc 2005-02-13 devnull getPW(char *id, int dead_or_alive)
41 6e527fbc 2005-02-13 devnull {
42 6e527fbc 2005-02-13 devnull uint now = time(0);
43 6e527fbc 2005-02-13 devnull Biobuf *bin;
44 6e527fbc 2005-02-13 devnull PW *pw;
45 cbeb0b26 2006-04-01 devnull char *f1, *f2; /* fields 1, 2 = attribute, value */
46 6e527fbc 2005-02-13 devnull
47 6e527fbc 2005-02-13 devnull if((bin = openPW(id, OREAD)) == 0){
48 6e527fbc 2005-02-13 devnull id = "FICTITIOUS";
49 6e527fbc 2005-02-13 devnull if((bin = openPW(id, OREAD)) == 0){
50 6e527fbc 2005-02-13 devnull werrstr("account does not exist");
51 6e527fbc 2005-02-13 devnull return nil;
52 6e527fbc 2005-02-13 devnull }
53 6e527fbc 2005-02-13 devnull }
54 6e527fbc 2005-02-13 devnull pw = emalloc(sizeof(*pw));
55 6e527fbc 2005-02-13 devnull pw->id = estrdup(id);
56 6e527fbc 2005-02-13 devnull pw->status |= Enabled;
57 6e527fbc 2005-02-13 devnull while( (f1 = Brdline(bin, '\n')) != 0){
58 6e527fbc 2005-02-13 devnull f1[Blinelen(bin)-1] = 0;
59 6e527fbc 2005-02-13 devnull for(f2 = f1; *f2 && (*f2!=' ') && (*f2!='\t'); f2++){}
60 6e527fbc 2005-02-13 devnull if(*f2)
61 6e527fbc 2005-02-13 devnull for(*f2++ = 0; *f2 && (*f2==' ' || *f2=='\t'); f2++){}
62 6e527fbc 2005-02-13 devnull if(strcmp(f1, "exp") == 0){
63 6e527fbc 2005-02-13 devnull pw->expire = strtoul(f2, 0, 10);
64 6e527fbc 2005-02-13 devnull }else if(strcmp(f1, "DISABLED") == 0){
65 6e527fbc 2005-02-13 devnull pw->status &= ~Enabled;
66 6e527fbc 2005-02-13 devnull }else if(strcmp(f1, "STA") == 0){
67 6e527fbc 2005-02-13 devnull pw->status |= STA;
68 6e527fbc 2005-02-13 devnull }else if(strcmp(f1, "failed") == 0){
69 6e527fbc 2005-02-13 devnull pw->failed = strtoul(f2, 0, 10);
70 6e527fbc 2005-02-13 devnull }else if(strcmp(f1, "other") == 0){
71 6e527fbc 2005-02-13 devnull pw->other = estrdup(f2);
72 6e527fbc 2005-02-13 devnull }else if(strcmp(f1, "PAK-Hi") == 0){
73 6e527fbc 2005-02-13 devnull pw->Hi = strtomp(f2, nil, 64, nil);
74 6e527fbc 2005-02-13 devnull }
75 6e527fbc 2005-02-13 devnull }
76 6e527fbc 2005-02-13 devnull Bterm(bin);
77 6e527fbc 2005-02-13 devnull if(dead_or_alive)
78 cbeb0b26 2006-04-01 devnull return pw; /* return PW entry for editing, whether currently valid or not */
79 6e527fbc 2005-02-13 devnull if(pw->expire <= now){
80 6e527fbc 2005-02-13 devnull werrstr("account expired");
81 6e527fbc 2005-02-13 devnull freePW(pw);
82 6e527fbc 2005-02-13 devnull return nil;
83 6e527fbc 2005-02-13 devnull }
84 6e527fbc 2005-02-13 devnull if((pw->status & Enabled) == 0){
85 6e527fbc 2005-02-13 devnull werrstr("account disabled");
86 6e527fbc 2005-02-13 devnull freePW(pw);
87 6e527fbc 2005-02-13 devnull return nil;
88 6e527fbc 2005-02-13 devnull }
89 6e527fbc 2005-02-13 devnull if(pw->failed < 10)
90 cbeb0b26 2006-04-01 devnull return pw; /* success */
91 6e527fbc 2005-02-13 devnull if(now < mtimePW(id)+300){
92 6e527fbc 2005-02-13 devnull werrstr("too many failures; try again in five minutes");
93 6e527fbc 2005-02-13 devnull freePW(pw);
94 6e527fbc 2005-02-13 devnull return nil;
95 6e527fbc 2005-02-13 devnull }
96 6e527fbc 2005-02-13 devnull pw->failed = 0;
97 cbeb0b26 2006-04-01 devnull putPW(pw); /* reset failed-login-counter after five minutes */
98 6e527fbc 2005-02-13 devnull return pw;
99 6e527fbc 2005-02-13 devnull }
100 6e527fbc 2005-02-13 devnull
101 6e527fbc 2005-02-13 devnull int
102 6e527fbc 2005-02-13 devnull putPW(PW *pw)
103 6e527fbc 2005-02-13 devnull {
104 6e527fbc 2005-02-13 devnull Biobuf *bout;
105 6e527fbc 2005-02-13 devnull char *hexHi;
106 6e527fbc 2005-02-13 devnull
107 6e527fbc 2005-02-13 devnull if((bout = openPW(pw->id, OWRITE|OTRUNC)) ==0){
108 6e527fbc 2005-02-13 devnull werrstr("can't open PW file");
109 6e527fbc 2005-02-13 devnull return -1;
110 6e527fbc 2005-02-13 devnull }
111 6e527fbc 2005-02-13 devnull Bprint(bout, "exp %lud\n", pw->expire);
112 6e527fbc 2005-02-13 devnull if(!(pw->status & Enabled))
113 6e527fbc 2005-02-13 devnull Bprint(bout, "DISABLED\n");
114 6e527fbc 2005-02-13 devnull if(pw->status & STA)
115 6e527fbc 2005-02-13 devnull Bprint(bout, "STA\n");
116 6e527fbc 2005-02-13 devnull if(pw->failed)
117 6e527fbc 2005-02-13 devnull Bprint(bout, "failed\t%d\n", pw->failed);
118 6e527fbc 2005-02-13 devnull if(pw->other)
119 6e527fbc 2005-02-13 devnull Bprint(bout,"other\t%s\n", pw->other);
120 6e527fbc 2005-02-13 devnull hexHi = mptoa(pw->Hi, 64, nil, 0);
121 6e527fbc 2005-02-13 devnull Bprint(bout, "PAK-Hi\t%s\n", hexHi);
122 6e527fbc 2005-02-13 devnull free(hexHi);
123 6e527fbc 2005-02-13 devnull return 0;
124 6e527fbc 2005-02-13 devnull }
125 6e527fbc 2005-02-13 devnull
126 6e527fbc 2005-02-13 devnull void
127 6e527fbc 2005-02-13 devnull freePW(PW *pw)
128 6e527fbc 2005-02-13 devnull {
129 6e527fbc 2005-02-13 devnull if(pw == nil)
130 6e527fbc 2005-02-13 devnull return;
131 6e527fbc 2005-02-13 devnull free(pw->id);
132 6e527fbc 2005-02-13 devnull free(pw->other);
133 6e527fbc 2005-02-13 devnull mpfree(pw->Hi);
134 6e527fbc 2005-02-13 devnull free(pw);
135 6e527fbc 2005-02-13 devnull }