|
|
1.1 root 1: /* popwrd.c - set password for a POP subscriber */
2:
3: #include "../h/strings.h"
4: #include "../zotnet/bboards.h"
5: #include <errno.h>
6: #include <pwd.h>
7: #include <signal.h>
8: #include <stdio.h>
9: #include <sys/types.h>
10: #include <sys/file.h>
11:
12:
13: static char temp[] = "ptmp";
14: static char home[BUFSIZ];
15:
16: extern int errno;
17:
18: char *crypt (), *getpass (), *tail ();
19:
20: #define compar(s,t) (strcmp (s, t) ? s : "")
21:
22: /* */
23:
24: /* ARGSUSED */
25:
26: main (argc, argv)
27: int argc;
28: char **argv;
29: {
30: int i,
31: fd,
32: flags,
33: insist;
34: long salt;
35: char c,
36: *cp,
37: buffer[BUFSIZ],
38: saltc[2],
39: **ap;
40: struct bboard *bb,
41: *bp;
42: struct passwd *pw;
43: FILE * fp;
44:
45: if ((pw = getpwnam (POPUID)) == NULL) {
46: fprintf (stderr, "no entry for ~%s.\n", POPUID);
47: exit (1);
48: }
49: if (chdir (strcpy (home, pw -> pw_dir)) < 0) {
50: fprintf (stderr, "no home directory for ~%s.\n", POPUID);
51: exit (1);
52: }
53: if (!setpwinfo (pw, POPDB, 0)) {
54: fprintf (stderr, "setbbinfo(%s, %s, 0) failed -- %s.\n",
55: pw -> pw_name, POPDB, getbberr ());
56: exit (1);
57: }
58:
59: if (argc != 2) {
60: fprintf (stderr, "usage: %s pop-subscriber\n", *argv);
61: exit (1);
62: }
63: if ((bb = getbbnam (argv[1])) == NULL
64: && (bb = getbbaka (argv[1])) == NULL) {
65: fprintf (stderr, "Permission denied.\n");
66: exit (1);
67: }
68:
69: if (!ldrbb (bb) && getuid () && !ldrchk (bb))
70: exit (1);
71:
72: if ((bp = getbbcpy (bb)) == NULL) {
73: fprintf (stderr, "getbbcpy loses.\n");
74: exit (1);
75: }
76:
77: (void) endbbent ();
78:
79: #ifdef lint
80: flags = 0;
81: #endif lint
82: for (insist = 0; insist < 2; insist++) {
83: if (insist)
84: printf ("Please use %s.\n",
85: flags == 1 ? "at least one non-numeric character"
86: : "a longer password");
87:
88: if ((i = strlen (strcpy (buffer, getpass ("New password:")))) == 0) {
89: fprintf (stderr, "Password unchanged.\n");
90: exit (1);
91: }
92:
93: flags = 0;
94: for (cp = buffer; c = *cp++;)
95: if (c >= 'a' && c <= 'z')
96: flags |= 2;
97: else
98: if (c >= 'A' && c <= 'Z')
99: flags |= 4;
100: else
101: if (c >= '0' && c <= '9')
102: flags |= 1;
103: else
104: flags |= 8;
105:
106: if ((flags >= 7 && i >= 4)
107: || ((flags == 2 || flags == 4) && i >= 6)
108: || ((flags == 3 || flags == 5 || flags == 6) && i >= 5))
109: break;
110: }
111:
112: if (strcmp (buffer, getpass ("Retype new password:"))) {
113: fprintf (stderr, "Mismatch - password unchanged.\n");
114: exit (1);
115: }
116:
117: (void) time (&salt);
118: salt ^= 9 * getpid ();
119: saltc[0] = salt & 077;
120: saltc[1] = (salt >> 6) & 077;
121: for (i = 0; i < 2; i++) {
122: c = saltc[i] + '.';
123: if (c > '9')
124: c += 7;
125: if (c > 'Z')
126: c += 6;
127: saltc[i] = c;
128: }
129: cp = crypt (buffer, saltc);
130:
131: (void) signal (SIGHUP, SIG_IGN);
132: (void) signal (SIGINT, SIG_IGN);
133: (void) signal (SIGQUIT, SIG_IGN);
134:
135: (void) umask (0);
136: if ((fd = open (temp, O_WRONLY | O_CREAT | O_EXCL, 0644)) < 0) {
137: switch (errno) {
138: case EEXIST:
139: fprintf (stderr, "POP file busy - try again later.\n");
140: break;
141:
142: default:
143: perror (temp);
144: break;
145: }
146: exit (1);
147: }
148:
149: (void) signal (SIGTSTP, SIG_IGN);
150: if ((fp = fdopen (fd, "w")) == NULL) {
151: fprintf (stderr, "fdopen loses.\n");
152: (void) unlink (temp);
153: exit (1);
154: }
155:
156: (void) setbbent (SB_STAY | SB_FAST);
157: while (bb = getbbent ()) {
158: if (strcmp (bb -> bb_name, bp -> bb_name) == 0)
159: bb -> bb_passwd = cp;
160: fprintf (fp, "%s:", bb -> bb_name);
161: if (ap = bb -> bb_aka)
162: for (; *ap; ap++)
163: fprintf (fp, "%s%s", ap != bb -> bb_aka ? "," : "", *ap);
164: fprintf (fp, ":%s:%s:", tail (bb -> bb_file), bb -> bb_passwd);
165: if ((ap = bb -> bb_leader) != NULL
166: && (strcmp (*ap, POPUID) != 0 || ap[1] != NULL))
167: for (; *ap; ap++)
168: fprintf (fp, "%s%s", ap != bb -> bb_leader ? "," : "", *ap);
169: fprintf (fp, ":%s:%s:%s:",
170: compar (bb -> bb_addr, bb -> bb_name),
171: compar (bb -> bb_request, POPUID),
172: bb -> bb_relay);
173: if (ap = bb -> bb_dist)
174: for (; *ap; ap++)
175: fprintf (fp, "%s%s", ap != bb -> bb_dist ? "," : "", *ap);
176: fprintf (fp, ":%o\n", bb -> bb_flags);
177: }
178: (void) endbbent ();
179:
180: if (rename (temp, POPDB) < 0) {
181: perror ("rename");
182: (void) unlink (temp);
183: exit (1);
184: }
185: (void) fclose (fp);
186:
187: exit (0);
188: }
189:
190: /* */
191:
192: char *tail (s)
193: char *s;
194: {
195: int i;
196: char *cp;
197:
198: if (strncmp (s, home, i = strlen (home)) == 0
199: && *(cp = s + i) == '/'
200: && *++cp)
201: return cp;
202:
203: return s;
204: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.