annotate support/pop/popwrd.c @ 0:bce86c4163a3

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