Blame


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