annotate APOPtools/apopcall.c @ 4:d741b3ecc917 draft

imapext-2007f
author HIROSE Yuuji <yuuji@gentei.org>
date Thu, 30 Oct 2014 00:03:05 +0900
parents 28a55bc1110c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
1 #include <stdio.h>
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
2 #include <stdlib.h>
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
3 #include <string.h>
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
4 #include <unistd.h>
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
5 #include <sys/types.h>
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
6 #include <sys/wait.h>
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
7 #include <sys/stat.h>
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
8 #include <pwd.h>
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
9 #ifdef SHADOW_PASSWD
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
10 #include <shadow.h>
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
11 #endif
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
12
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
13 #ifndef APOPPASSWD
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
14 #define APOPPASSWD "/usr/local/bin/apoppasswd"
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
15 #endif
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
16 #ifndef APOPFILEBASE
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
17 #define APOPFILEBASE ".apop"
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
18 #endif
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
19 #ifndef XADDR_DELIM
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
20 #define XADDR_DELIM ('-')
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
21 #endif
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
22
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
23 char *myname;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
24
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
25 int ishexa(int c) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
26 strchr("0123456789ABCDFabcdef", c) ? 1 : 0;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
27 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
28
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
29 put_form(email, pass, new, new2, suffix, hidden, auth, force)
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
30 char *email, *pass, *new, *new2, *suffix;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
31 int hidden, auth, force;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
32 /* auth = 0: old password
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
33 1: base addresse's mail password
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
34 2: unix password */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
35 {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
36 char *authtype[] = {"old", "base", "unix"};
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
37 char *var[] = {"email", "pass", "new", "new2", "auth", ""};
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
38 char *val[] = {email, pass, new, new2, authtype[auth]};
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
39 char *prm[] = {"", /* "ユーザ名", */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
40 auth ?
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
41 ((auth==1)
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
42 ? "基本メイルアドレス用パスワード<br>Password for Basic Mail address"
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
43 : "UNIXログインパスワード<br>UNIX login Password")
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
44 : "古いメイルパスワード<br>Old Mail Password",
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
45 "新しいメイルパスワード<br>New Mail Password",
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
46 "新パスワードをもう一回(確認)<br>New Mail Password Again",
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
47 ""};
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
48 int h=0, i;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
49
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
50 printf("<form method=POST action\"./%s\">\n", myname);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
51 printf(" <table border=1>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
52 for (i=0; var[i][0]; i++) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
53 h = hidden || strstr("email,suffix,auth", var[i]);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
54 if (prm[i][0]) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
55 printf("<tr><td>%s</td><td>", prm[i]);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
56 } else {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
57 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
58 printf("<input name=%s %svalue=\"%s\" length=40 maxlength=40>\n",
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
59 var[i],
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
60 h ? "type=hidden "
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
61 : (strstr(prm[i], "パスワード") ? "type=password " : "<br>"),
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
62 val[i]);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
63 if (!strcmp(var[i], "suffix")) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
64 /* ここでは suffix を入れさせない方がいいかも */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
65 /* 表向きのメイルアドレスを表示しておく */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
66 printf("%s", email);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
67 /* if (suffix[0]) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
68 printf("-%s", suffix);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
69 } */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
70 if (auth)
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
71 printf("<br>(新規作成:New Account)");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
72 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
73 if (prm[i][0])
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
74 printf("</td></tr>");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
75 printf("\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
76 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
77
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
78 printf("</table>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
79 if (force)
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
80 printf("<input name=force type=hidden value=ON>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
81 if (auth) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
82 char *a[] = {"basic", "unix"};
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
83 printf("<input type=hidden name=auth value=\"%s\">\n", a[auth-1]);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
84 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
85 printf("<input name=OK value=OK type=submit>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
86 printf("<input name=RESET value=RESET type=reset>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
87 printf("</form>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
88 fflush(stdout);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
89 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
90
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
91 char *decode(char *code) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
92 int l=1+strlen(code);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
93 int i, c, d;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
94 char *ret = (char*)malloc(l*sizeof(char));
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
95 char *p = code;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
96 memset(ret, 0, l);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
97 for (i=0; i<strlen(code); i++) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
98 if (code[i] == '+') code[i] = ' ';
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
99 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
100 while (code[0] && (p=strchr(code, '%'))
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
101 && ishexa(*(p+1)) && ishexa(*(p+2))) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
102 *(p++) = '\0';
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
103 strncat(ret, code, l);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
104 c = (islower(*p) ? toupper(*p) : *p) - '0';
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
105 p++;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
106 d = (islower(*p) ? toupper(*p) : *p) - '0';
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
107 if (c > 9) c -= ('A'-'9'-1);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
108 if (d > 9) d -= ('A'-'9'-1);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
109 ret[strlen(ret)] = c*16+d;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
110 code = p+1;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
111 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
112 if (code[0]) strncat(ret, code, l);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
113 return ret;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
114 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
115
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
116 #define BSIZE 8192
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
117 char **decode_post() {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
118 char *buf = (char*)malloc(BSIZE*sizeof(char));
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
119 char **post, *p = buf;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
120 int n=0, i;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
121 post = (char**)calloc(1, sizeof(char*));
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
122 *buf = '\0';
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
123 fgets(buf, BSIZE, stdin);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
124 if (strchr("\n\r", buf[strlen(buf)-1])) /* chop */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
125 buf[strlen(buf)-1] = '\0';
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
126 while (buf[0] && NULL != (p=strchr(buf, '&'))) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
127 *p = '\0';
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
128 post[n] = (char*)malloc((p-buf+1)*sizeof(char));
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
129 strcpy(post[n], buf);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
130 n++;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
131 post = (char**)realloc(post, (1+n)*sizeof(char*));
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
132 buf = 1+p;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
133 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
134 if (buf[0]) post[n++] = buf;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
135 /* decode URL encoded */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
136 for (i=0; i < n; i++) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
137 char *p;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
138 p=post[i];
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
139 post[i] = decode(p);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
140 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
141 post[i] = ""; /* terminator */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
142 return post;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
143 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
144
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
145 void footer() {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
146 puts("</body>\n</html>");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
147 fflush(stdout);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
148 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
149
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
150 void fail() {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
151 printf("パスワード更新に失敗しました<br>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
152 printf("<a href=\"./\">やり直し</a><br>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
153 footer();
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
154 exit(1);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
155 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
156 void success(char *email) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
157 printf("<hr>メイルアカウント %s 用のパスワード更新は完了しました。<br>\n",
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
158 email);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
159 footer();
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
160 exit(0);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
161 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
162
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
163 int apopfile_existp(char *home, char *suffix, uid_t uid) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
164 struct stat st;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
165 int s;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
166 int len = strlen(home) + 1
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
167 + strlen(APOPFILEBASE) + strlen(suffix) + 3;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
168 char *apopfile = (char*)malloc(len);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
169 if (suffix[0]) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
170 snprintf(apopfile, len, "%s/%s%c%s%c",
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
171 home, APOPFILEBASE, XADDR_DELIM, suffix, 0);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
172 } else {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
173 snprintf(apopfile, len, "%s/%s%c", home, APOPFILEBASE, 0);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
174 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
175 seteuid(uid);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
176 s = stat(apopfile, &st);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
177 seteuid(0);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
178 memset(apopfile, '\0', strlen(apopfile));
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
179 free(apopfile);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
180 return !s;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
181 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
182
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
183 #ifndef QMAILCONTROL
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
184 # define QMAILCONTROL "/var/qmail/control"
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
185 #endif
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
186 #ifndef MAILTMPLEN
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
187 # define MAILTMPLEN 1024
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
188 #endif
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
189
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
190 /* Convert virtual domain user
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
191 */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
192 char* conv_virtualdomain(char *account) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
193 char *dom = strchr(account, '@'), *p;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
194 char vd[MAILTMPLEN+1], rewrite[MAILTMPLEN+1], previous[MAILTMPLEN+1];
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
195 FILE *vdfd;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
196 int match=0;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
197 char buf[MAILTMPLEN+1], *s;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
198 snprintf(vd, MAILTMPLEN, "%s/%s", QMAILCONTROL, "virtualdomains");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
199 if (NULL == dom) return account;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
200 dom++; /* set position of domain part beginning */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
201 if (dom && NULL != (vdfd = fopen (vd, "r"))) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
202 int l = strlen(dom);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
203 int L = strlen(account);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
204 while ((s=fgets(buf, MAILTMPLEN, vdfd))) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
205 if (p=strchr(s, '#'))
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
206 *p = '\0'; /* zap comments */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
207 if (!strchr(buf, ':'))
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
208 continue;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
209 while (s && (strrchr(s, '\n') || strrchr(s, '\r') || strrchr(s, ' ')))
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
210 s[strlen(s)-1] = '\0';
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
211 if (!strncmp(account, s, L) && s[L] == ':' && s[L+1]) { /* user matches */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
212 match = 3;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
213 snprintf(rewrite, MAILTMPLEN, "%s-%s", s+L+1, account);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
214 break;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
215 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
216 if (!strncmp(dom, s, l) && s[l] == ':' && s[l+1]) { /* domain matches */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
217 match = 2;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
218 snprintf(rewrite, MAILTMPLEN, "%s%c%s", s+l+1, XADDR_DELIM, account);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
219 continue;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
220 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
221 if (match < 2 && s[0] == '.') { /* if domain described in wildcard */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
222 if (p=strchr(s, ':')) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
223 *p = '\0';
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
224 if (!strcmp(dom+(strlen(dom)-strlen(s)), s)) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
225 if (match == 0
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
226 || strlen(previous) < strlen(s)) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
227 match = 1;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
228 strncpy(previous, s, MAILTMPLEN);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
229 snprintf(rewrite, MAILTMPLEN, "%s%c%s", p+1, XADDR_DELIM, account);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
230 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
231 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
232 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
233 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
234 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
235 fclose(vdfd);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
236 if (match) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
237 p = strchr(rewrite, '@');
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
238 /* fprintf(stderr, "m=%d, rwr=[%s]\n", match, rewrite); */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
239 if (p) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
240 *p = '\0';
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
241 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
242 /* fprintf(stderr, "rwr=[%s]\n", rewrite); */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
243 s = malloc(strlen(rewrite)+1);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
244 strncpy(s, rewrite, strlen(rewrite)+1);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
245 memset(vd, 0, sizeof(vd));
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
246 memset(rewrite, 0, sizeof(rewrite));
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
247 memset(previous, 0, sizeof(previous));
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
248 return s;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
249 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
250 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
251 /* Then, compare with locals */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
252 snprintf(vd, MAILTMPLEN, "%s/%s", QMAILCONTROL, "locals");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
253 if (NULL != (vdfd=fopen(vd, "r"))) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
254 while (s=fgets(buf, MAILTMPLEN, vdfd)) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
255 if (p=strchr(s, '#')) *p = '\0'; /* zap after comment mark # */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
256 while (*s && (strrchr(s, '\r')||strrchr(s, '\n')
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
257 ||strrchr(s, ' ')||strrchr(s, '\t'))) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
258 *(s+strlen(s)-1) = '\0';
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
259 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
260 while (*s && (*s == '\t' || *s == ' ')) s++;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
261 if (!strncmp(s, dom, strlen(s))) { /* matches with local domain */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
262 int len = dom-account-1;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
263 p = (char*)malloc(len+1);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
264 memset(p, '\0', len+1);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
265 strncpy(p, account, len);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
266 return p;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
267 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
268 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
269 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
270 return NULL; /* invalid domain */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
271 /* return account; return itself */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
272 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
273
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
274 void apopcall(char **args) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
275 int i=0, sc=0;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
276 pid_t pid;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
277 char *email="", *suffix="", *pass="", *new="", *new2 = "", *home="";
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
278 char buf[BUFSIZ], auth, *user;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
279 FILE *child, *result;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
280 while (args[i][0]) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
281 /* printf("[%s]<br>\n", args[i]); */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
282 if (!strncmp("email=", args[i], 6)) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
283 email = args[i]+6;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
284 } else if (!strncmp("suffix=", args[i], 7)) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
285 suffix = args[i]+7;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
286 } else if (!strncmp("pass=", args[i], 5)) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
287 pass = args[i]+5;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
288 } else if (!strncmp("new=", args[i], 4)) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
289 new = args[i]+4;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
290 } else if (!strncmp("new2=", args[i], 5)) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
291 new2 = args[i]+5;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
292 } else if (!strncmp("auth=", args[i], 5)) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
293 /* "this" or "base" or "unix" */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
294 auth = args[i][5];
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
295 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
296 i++;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
297 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
298 /* Make a backup of original e-mail address */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
299 /* user = (char*)malloc(1+strlen(email));
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
300 strcpy(user, email);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
301 */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
302 user = conv_virtualdomain(email);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
303 if (NULL == user) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
304 printf("そのようなドメインは無効です(%s)<br>\n", strchr(email, '@'));
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
305 printf("入力したメイルアドレスを確認してやり直してください.<br>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
306 fail();
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
307 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
308 if (strchr(user, XADDR_DELIM)) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
309 char *p = malloc(1+strlen(user));
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
310 char *q = NULL;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
311 struct passwd *pwd;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
312 /* printf("user=[%s]<br>\n", user); */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
313
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
314 memset(p, '\0', 1+strlen(user));
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
315 strcpy(p, user);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
316 while (!(pwd=getpwnam(p)) && (q=strrchr(p, XADDR_DELIM))) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
317 fflush(stdout);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
318 *q = '\0';
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
319 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
320 if (pwd && q) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
321 q = user+(q-p)+1;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
322 user=p;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
323 suffix=q;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
324 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
325 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
326 if (user[0] && new[0] && new2[0]) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
327 int tochild[2], toparent[2];
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
328 pid_t pid;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
329 int argc=0;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
330 char **argv;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
331 struct passwd *pswd;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
332 char *pstr;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
333
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
334 if (!(pswd=getpwnam(user))) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
335 printf("Unkown user %s.\n", user);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
336 fflush(stdout);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
337 fail();
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
338 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
339 pstr = pswd->pw_passwd;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
340 #ifdef SHADOW_PASSWD
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
341 { struct spwd *ss = getspnam(user);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
342 pstr = (char*)ss->sp_pwdp;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
343 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
344 #endif
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
345 home=pswd->pw_dir;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
346 argv = (char**)calloc(4, sizeof(char*));
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
347 argv[argc++] = "apoppasswd";
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
348 argv[argc++] = "-s";
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
349 argv[argc++] = "-c";
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
350 /* if old password does not exist,
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
351 then check UNIX password */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
352 #if 0
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
353 if (apopfile_existp(home, suffix, pswd->pw_uid)) { /* no apop-ext exists */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
354 /* そのまま */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
355 } else if (apopfile_existp(home, "", pswd->pw_uid)) {/* check base mail password */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
356 argv = (char**)realloc(argv, (argc+2)*sizeof(char*));
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
357 argv[argc++] = "-b";
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
358 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
359 #endif
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
360 switch (auth) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
361 case 'b': case 'B':
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
362 if (apopfile_existp(home, "", pswd->pw_uid)) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
363 argv = (char**)realloc(argv, (argc+2)*sizeof(char*));
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
364 argv[argc++] = "-b";
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
365 } else {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
366 printf("基本アドレスのパスワードファイルがありません<br>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
367 fail();
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
368 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
369 break;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
370 case 'u': case 'U':
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
371 if (strcmp(pstr, (char*)crypt(pass, pstr))) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
372 printf("UNIX Password not correct.<br>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
373 /* printf("[%s]vs.[%s]<br>\n",
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
374 pswd->pw_passwd, crypt(pass, pswd->pw_passwd)); */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
375 printf("UNIXパスワードと一致しません.<br>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
376 fflush(stdout);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
377 fail();
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
378 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
379 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
380
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
381 if (strlen(new) < 8 || strlen(new2) < 8) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
382 printf("New mail password must be more than 7 characters.<br>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
383 printf("メイルパスワードは8文字以上にしてください。<br>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
384 fflush(stdout);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
385 fail();
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
386 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
387 if (suffix[0]) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
388 argv = (char**)realloc(argv, (argc+3)*sizeof(char*));
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
389 argv[argc++] = "-e";
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
390 argv[argc++] = suffix;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
391
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
392 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
393 argv[argc++] = NULL;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
394 if (setgid(pswd->pw_gid) || 0 != setuid(pswd->pw_uid)) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
395 printf("Cannot switch to %s\n", user);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
396 printf("uid=%d, gid=%d<br>\n", pswd->pw_gid, pswd->pw_uid);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
397 printf("メイルパスワード変更サーバの設定不良の可能性があるので<br>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
398 printf("お手数ですがこの画面のコピーを添えてシステム管理者");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
399 printf("まで御連絡下さい。<br>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
400 fflush(stdout);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
401 fail();
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
402 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
403
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
404 /* OK, start apopasswd */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
405 if (pipe(tochild)+pipe(toparent)) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
406 printf("Cannot create pipe\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
407 fail();
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
408 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
409 if ((pid=fork()) > 0) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
410 FILE *child = fdopen(tochild[1], "w");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
411 close(tochild[0]);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
412 close(toparent[1]);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
413 fprintf(child, "PASS %s\nNEW %s\nNEW2 %s\n",
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
414 pass, new, new2);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
415 fflush(child);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
416 fclose(child);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
417
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
418 } else if (pid == -1) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
419 printf("Cannot fork\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
420 fail();
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
421 } else {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
422 char *pe = malloc(6+strlen(pswd->pw_dir));
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
423 close(tochild[1]);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
424 close(toparent[0]);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
425 dup2(tochild[0], 0);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
426 dup2(toparent[1], 1);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
427
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
428 /* setuid section */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
429
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
430 strcpy(pe, "HOME=");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
431 strcat(pe, pswd->pw_dir);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
432 if (putenv(pe)) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
433 puts("ga-n! arichan gakkari<br>");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
434 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
435 execv(APOPPASSWD, argv);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
436
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
437 /* setuid section ends */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
438 fprintf(stderr, "Cannot exec %s\n", APOPPASSWD);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
439 fail();
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
440 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
441 result = fdopen(toparent[0], "r");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
442 while (fgets(buf, BUFSIZ, result)) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
443 printf("%s<br>", buf);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
444 fflush(stdout);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
445 if (strstr(buf, "Success!")) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
446 printf("<br>Mail Password changed successfully!<br>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
447 sc++;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
448 break;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
449 } else if (strstr(buf, "mismatch")) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
450 printf("二個入れた新パスワードが一致しません.<br>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
451 break;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
452 } else if (strstr(buf, "Illegal")) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
453 printf("照合用パスワードが違います.<br>--\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
454 break;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
455 } else if (strstr(buf, "does not exist")) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
456 /* try_overwrite(user, pass, new, new2, suffix); */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
457 if (suffix[0]) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
458 printf("%s-%s", user, suffix);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
459 } else {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
460 printf("%s", user);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
461 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
462 /* ここは来ないことになった(のはず) */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
463 printf("というメイルアカウントは未作成です<br>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
464 printf("新規に作る場合はOKボタンをクリック\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
465 put_form(email, pass, new, new2, suffix, 1, 0, 1);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
466 fflush(stdout);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
467 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
468 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
469 fclose(result);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
470 while (wait(0) != pid) {sleep(1);fputc('.', stderr);}
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
471 if (sc) success(email); else fail();
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
472 } else if (user[0]) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
473 struct passwd *pw = getpwnam(user);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
474 int auth=0;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
475 if (!pw) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
476 printf("そのようなユーザはいません %s<br>\n", user);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
477 fail();
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
478 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
479 home=pw->pw_dir;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
480
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
481 printf("%s というメイルアドレスの<br>\n", email);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
482 printf("メイル専用パスワードを変更します.<br>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
483 printf("メイルパスワードとUNIXパスワードの違いに気をつけてください.<br>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
484 printf("新パスワードは8文字以上にしてください.<br>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
485 printf("New password must be more than or equal to 8 characters.<br>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
486 if (apopfile_existp(home, suffix, pw->pw_uid)) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
487 auth = 0; /* this password file */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
488 printf("「古いメイルパスワード」には、現在<br>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
489 printf("<tt>%s</tt><br>\n", email);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
490 printf("を読むために指定しているパスワードを入力します。");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
491 } else if (apopfile_existp(home, "", pw->pw_uid)) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
492 auth = 1; /* basic mail address password */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
493 printf("今回は本人認証として基本メイルアドレスのパスワードを");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
494 printf("入力しますが、新しくパスワードを設定するのは<br>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
495 printf("<tt>%s</tt><br>\n", email);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
496 printf("用のパスワードです。基本メイルアドレスのパスワードは");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
497 printf("変わりませんので注意してください。");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
498 } else {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
499 auth = 2; /* UNIX login */
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
500 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
501 put_form(email, "", "", "", suffix, 0, auth, 0);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
502 footer();
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
503 exit(0);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
504 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
505 printf("user=[%s]\n", user);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
506 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
507
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
508 int main(int argc, char* argv[]) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
509 char *method = getenv("REQUEST_METHOD");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
510 char **args;
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
511 myname = argv[0];
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
512 if (method && strcmp(method, "POST") != 0) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
513 printf("This program should be used in method:POST.\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
514 fail();
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
515 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
516 printf("Content-type: text/html; charset=EUC-JP\n\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
517 printf("<html>\n<head><title>Change Password</title></head>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
518 printf("<body style=\"background: #f0ffff;\">\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
519 if (getenv("SSL_CIPHER") && getenv("SSL_PROTOCOL")) {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
520 args = decode_post();
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
521 apopcall(args);
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
522 } else {
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
523 printf("This program can be used only via SSL connection.<br>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
524 printf("このユーティリティはSSL接続時のみ有効です.<br>\n");
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
525 }
28a55bc1110c [mq]: imapext
yuuji@gentei.org
parents:
diff changeset
526 }
4
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
527 #include <stdio.h>
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
528 #include <stdlib.h>
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
529 #include <string.h>
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
530 #include <unistd.h>
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
531 #include <sys/types.h>
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
532 #include <sys/wait.h>
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
533 #include <sys/stat.h>
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
534 #include <pwd.h>
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
535 #ifdef SHADOW_PASSWD
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
536 #include <shadow.h>
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
537 #endif
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
538
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
539 #ifndef APOPPASSWD
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
540 #define APOPPASSWD "/usr/local/bin/apoppasswd"
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
541 #endif
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
542 #ifndef APOPFILEBASE
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
543 #define APOPFILEBASE ".apop"
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
544 #endif
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
545 #ifndef XADDR_DELIM
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
546 #define XADDR_DELIM ('-')
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
547 #endif
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
548
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
549 char *myname;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
550
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
551 int ishexa(int c) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
552 strchr("0123456789ABCDFabcdef", c) ? 1 : 0;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
553 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
554
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
555 put_form(email, pass, new, new2, suffix, hidden, auth, force)
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
556 char *email, *pass, *new, *new2, *suffix;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
557 int hidden, auth, force;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
558 /* auth = 0: old password
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
559 1: base addresse's mail password
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
560 2: unix password */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
561 {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
562 char *authtype[] = {"old", "base", "unix"};
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
563 char *var[] = {"email", "pass", "new", "new2", "auth", ""};
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
564 char *val[] = {email, pass, new, new2, authtype[auth]};
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
565 char *prm[] = {"", /* "ユーザ名", */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
566 auth ?
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
567 ((auth==1)
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
568 ? "基本メイルアドレス用パスワード<br>Password for Basic Mail address"
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
569 : "UNIXログインパスワード<br>UNIX login Password")
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
570 : "古いメイルパスワード<br>Old Mail Password",
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
571 "新しいメイルパスワード<br>New Mail Password",
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
572 "新パスワードをもう一回(確認)<br>New Mail Password Again",
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
573 ""};
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
574 int h=0, i;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
575
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
576 printf("<form method=POST action\"./%s\">\n", myname);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
577 printf(" <table border=1>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
578 for (i=0; var[i][0]; i++) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
579 h = hidden || strstr("email,suffix,auth", var[i]);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
580 if (prm[i][0]) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
581 printf("<tr><td>%s</td><td>", prm[i]);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
582 } else {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
583 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
584 printf("<input name=%s %svalue=\"%s\" length=40 maxlength=40>\n",
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
585 var[i],
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
586 h ? "type=hidden "
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
587 : (strstr(prm[i], "パスワード") ? "type=password " : "<br>"),
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
588 val[i]);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
589 if (!strcmp(var[i], "suffix")) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
590 /* ここでは suffix を入れさせない方がいいかも */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
591 /* 表向きのメイルアドレスを表示しておく */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
592 printf("%s", email);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
593 /* if (suffix[0]) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
594 printf("-%s", suffix);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
595 } */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
596 if (auth)
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
597 printf("<br>(新規作成:New Account)");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
598 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
599 if (prm[i][0])
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
600 printf("</td></tr>");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
601 printf("\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
602 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
603
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
604 printf("</table>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
605 if (force)
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
606 printf("<input name=force type=hidden value=ON>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
607 if (auth) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
608 char *a[] = {"basic", "unix"};
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
609 printf("<input type=hidden name=auth value=\"%s\">\n", a[auth-1]);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
610 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
611 printf("<input name=OK value=OK type=submit>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
612 printf("<input name=RESET value=RESET type=reset>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
613 printf("</form>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
614 fflush(stdout);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
615 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
616
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
617 char *decode(char *code) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
618 int l=1+strlen(code);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
619 int i, c, d;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
620 char *ret = (char*)malloc(l*sizeof(char));
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
621 char *p = code;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
622 memset(ret, 0, l);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
623 for (i=0; i<strlen(code); i++) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
624 if (code[i] == '+') code[i] = ' ';
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
625 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
626 while (code[0] && (p=strchr(code, '%'))
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
627 && ishexa(*(p+1)) && ishexa(*(p+2))) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
628 *(p++) = '\0';
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
629 strncat(ret, code, l);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
630 c = (islower(*p) ? toupper(*p) : *p) - '0';
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
631 p++;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
632 d = (islower(*p) ? toupper(*p) : *p) - '0';
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
633 if (c > 9) c -= ('A'-'9'-1);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
634 if (d > 9) d -= ('A'-'9'-1);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
635 ret[strlen(ret)] = c*16+d;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
636 code = p+1;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
637 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
638 if (code[0]) strncat(ret, code, l);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
639 return ret;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
640 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
641
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
642 #define BSIZE 8192
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
643 char **decode_post() {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
644 char *buf = (char*)malloc(BSIZE*sizeof(char));
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
645 char **post, *p = buf;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
646 int n=0, i;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
647 post = (char**)calloc(1, sizeof(char*));
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
648 *buf = '\0';
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
649 fgets(buf, BSIZE, stdin);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
650 if (strchr("\n\r", buf[strlen(buf)-1])) /* chop */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
651 buf[strlen(buf)-1] = '\0';
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
652 while (buf[0] && NULL != (p=strchr(buf, '&'))) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
653 *p = '\0';
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
654 post[n] = (char*)malloc((p-buf+1)*sizeof(char));
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
655 strcpy(post[n], buf);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
656 n++;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
657 post = (char**)realloc(post, (1+n)*sizeof(char*));
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
658 buf = 1+p;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
659 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
660 if (buf[0]) post[n++] = buf;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
661 /* decode URL encoded */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
662 for (i=0; i < n; i++) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
663 char *p;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
664 p=post[i];
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
665 post[i] = decode(p);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
666 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
667 post[i] = ""; /* terminator */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
668 return post;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
669 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
670
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
671 void footer() {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
672 puts("</body>\n</html>");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
673 fflush(stdout);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
674 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
675
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
676 void fail() {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
677 printf("パスワード更新に失敗しました<br>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
678 printf("<a href=\"./\">やり直し</a><br>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
679 footer();
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
680 exit(1);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
681 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
682 void success(char *email) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
683 printf("<hr>メイルアカウント %s 用のパスワード更新は完了しました。<br>\n",
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
684 email);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
685 footer();
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
686 exit(0);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
687 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
688
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
689 int apopfile_existp(char *home, char *suffix, uid_t uid) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
690 struct stat st;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
691 int s;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
692 int len = strlen(home) + 1
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
693 + strlen(APOPFILEBASE) + strlen(suffix) + 3;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
694 char *apopfile = (char*)malloc(len);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
695 if (suffix[0]) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
696 snprintf(apopfile, len, "%s/%s%c%s%c",
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
697 home, APOPFILEBASE, XADDR_DELIM, suffix, 0);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
698 } else {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
699 snprintf(apopfile, len, "%s/%s%c", home, APOPFILEBASE, 0);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
700 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
701 seteuid(uid);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
702 s = stat(apopfile, &st);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
703 seteuid(0);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
704 memset(apopfile, '\0', strlen(apopfile));
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
705 free(apopfile);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
706 return !s;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
707 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
708
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
709 #ifndef QMAILCONTROL
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
710 # define QMAILCONTROL "/var/qmail/control"
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
711 #endif
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
712 #ifndef MAILTMPLEN
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
713 # define MAILTMPLEN 1024
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
714 #endif
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
715
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
716 /* Convert virtual domain user
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
717 */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
718 char* conv_virtualdomain(char *account) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
719 char *dom = strchr(account, '@'), *p;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
720 char vd[MAILTMPLEN+1], rewrite[MAILTMPLEN+1], previous[MAILTMPLEN+1];
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
721 FILE *vdfd;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
722 int match=0;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
723 char buf[MAILTMPLEN+1], *s;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
724 snprintf(vd, MAILTMPLEN, "%s/%s", QMAILCONTROL, "virtualdomains");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
725 if (NULL == dom) return account;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
726 dom++; /* set position of domain part beginning */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
727 if (dom && NULL != (vdfd = fopen (vd, "r"))) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
728 int l = strlen(dom);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
729 int L = strlen(account);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
730 while ((s=fgets(buf, MAILTMPLEN, vdfd))) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
731 if (p=strchr(s, '#'))
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
732 *p = '\0'; /* zap comments */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
733 if (!strchr(buf, ':'))
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
734 continue;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
735 while (s && (strrchr(s, '\n') || strrchr(s, '\r') || strrchr(s, ' ')))
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
736 s[strlen(s)-1] = '\0';
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
737 if (!strncmp(account, s, L) && s[L] == ':' && s[L+1]) { /* user matches */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
738 match = 3;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
739 snprintf(rewrite, MAILTMPLEN, "%s-%s", s+L+1, account);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
740 break;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
741 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
742 if (!strncmp(dom, s, l) && s[l] == ':' && s[l+1]) { /* domain matches */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
743 match = 2;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
744 snprintf(rewrite, MAILTMPLEN, "%s%c%s", s+l+1, XADDR_DELIM, account);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
745 continue;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
746 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
747 if (match < 2 && s[0] == '.') { /* if domain described in wildcard */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
748 if (p=strchr(s, ':')) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
749 *p = '\0';
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
750 if (!strcmp(dom+(strlen(dom)-strlen(s)), s)) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
751 if (match == 0
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
752 || strlen(previous) < strlen(s)) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
753 match = 1;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
754 strncpy(previous, s, MAILTMPLEN);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
755 snprintf(rewrite, MAILTMPLEN, "%s%c%s", p+1, XADDR_DELIM, account);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
756 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
757 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
758 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
759 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
760 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
761 fclose(vdfd);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
762 if (match) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
763 p = strchr(rewrite, '@');
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
764 /* fprintf(stderr, "m=%d, rwr=[%s]\n", match, rewrite); */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
765 if (p) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
766 *p = '\0';
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
767 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
768 /* fprintf(stderr, "rwr=[%s]\n", rewrite); */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
769 s = malloc(strlen(rewrite)+1);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
770 strncpy(s, rewrite, strlen(rewrite)+1);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
771 memset(vd, 0, sizeof(vd));
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
772 memset(rewrite, 0, sizeof(rewrite));
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
773 memset(previous, 0, sizeof(previous));
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
774 return s;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
775 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
776 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
777 /* Then, compare with locals */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
778 snprintf(vd, MAILTMPLEN, "%s/%s", QMAILCONTROL, "locals");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
779 if (NULL != (vdfd=fopen(vd, "r"))) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
780 while (s=fgets(buf, MAILTMPLEN, vdfd)) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
781 if (p=strchr(s, '#')) *p = '\0'; /* zap after comment mark # */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
782 while (*s && (strrchr(s, '\r')||strrchr(s, '\n')
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
783 ||strrchr(s, ' ')||strrchr(s, '\t'))) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
784 *(s+strlen(s)-1) = '\0';
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
785 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
786 while (*s && (*s == '\t' || *s == ' ')) s++;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
787 if (!strncmp(s, dom, strlen(s))) { /* matches with local domain */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
788 int len = dom-account-1;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
789 p = (char*)malloc(len+1);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
790 memset(p, '\0', len+1);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
791 strncpy(p, account, len);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
792 return p;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
793 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
794 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
795 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
796 return NULL; /* invalid domain */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
797 /* return account; return itself */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
798 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
799
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
800 void apopcall(char **args) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
801 int i=0, sc=0;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
802 pid_t pid;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
803 char *email="", *suffix="", *pass="", *new="", *new2 = "", *home="";
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
804 char buf[BUFSIZ], auth, *user;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
805 FILE *child, *result;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
806 while (args[i][0]) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
807 /* printf("[%s]<br>\n", args[i]); */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
808 if (!strncmp("email=", args[i], 6)) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
809 email = args[i]+6;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
810 } else if (!strncmp("suffix=", args[i], 7)) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
811 suffix = args[i]+7;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
812 } else if (!strncmp("pass=", args[i], 5)) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
813 pass = args[i]+5;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
814 } else if (!strncmp("new=", args[i], 4)) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
815 new = args[i]+4;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
816 } else if (!strncmp("new2=", args[i], 5)) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
817 new2 = args[i]+5;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
818 } else if (!strncmp("auth=", args[i], 5)) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
819 /* "this" or "base" or "unix" */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
820 auth = args[i][5];
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
821 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
822 i++;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
823 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
824 /* Make a backup of original e-mail address */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
825 /* user = (char*)malloc(1+strlen(email));
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
826 strcpy(user, email);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
827 */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
828 user = conv_virtualdomain(email);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
829 if (NULL == user) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
830 printf("そのようなドメインは無効です(%s)<br>\n", strchr(email, '@'));
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
831 printf("入力したメイルアドレスを確認してやり直してください.<br>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
832 fail();
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
833 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
834 if (strchr(user, XADDR_DELIM)) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
835 char *p = malloc(1+strlen(user));
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
836 char *q = NULL;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
837 struct passwd *pwd;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
838 /* printf("user=[%s]<br>\n", user); */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
839
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
840 memset(p, '\0', 1+strlen(user));
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
841 strcpy(p, user);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
842 while (!(pwd=getpwnam(p)) && (q=strrchr(p, XADDR_DELIM))) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
843 fflush(stdout);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
844 *q = '\0';
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
845 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
846 if (pwd && q) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
847 q = user+(q-p)+1;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
848 user=p;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
849 suffix=q;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
850 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
851 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
852 if (user[0] && new[0] && new2[0]) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
853 int tochild[2], toparent[2];
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
854 pid_t pid;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
855 int argc=0;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
856 char **argv;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
857 struct passwd *pswd;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
858 char *pstr;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
859
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
860 if (!(pswd=getpwnam(user))) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
861 printf("Unkown user %s.\n", user);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
862 fflush(stdout);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
863 fail();
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
864 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
865 pstr = pswd->pw_passwd;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
866 #ifdef SHADOW_PASSWD
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
867 { struct spwd *ss = getspnam(user);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
868 pstr = (char*)ss->sp_pwdp;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
869 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
870 #endif
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
871 home=pswd->pw_dir;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
872 argv = (char**)calloc(4, sizeof(char*));
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
873 argv[argc++] = "apoppasswd";
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
874 argv[argc++] = "-s";
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
875 argv[argc++] = "-c";
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
876 /* if old password does not exist,
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
877 then check UNIX password */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
878 #if 0
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
879 if (apopfile_existp(home, suffix, pswd->pw_uid)) { /* no apop-ext exists */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
880 /* そのまま */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
881 } else if (apopfile_existp(home, "", pswd->pw_uid)) {/* check base mail password */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
882 argv = (char**)realloc(argv, (argc+2)*sizeof(char*));
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
883 argv[argc++] = "-b";
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
884 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
885 #endif
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
886 switch (auth) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
887 case 'b': case 'B':
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
888 if (apopfile_existp(home, "", pswd->pw_uid)) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
889 argv = (char**)realloc(argv, (argc+2)*sizeof(char*));
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
890 argv[argc++] = "-b";
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
891 } else {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
892 printf("基本アドレスのパスワードファイルがありません<br>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
893 fail();
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
894 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
895 break;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
896 case 'u': case 'U':
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
897 if (strcmp(pstr, (char*)crypt(pass, pstr))) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
898 printf("UNIX Password not correct.<br>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
899 /* printf("[%s]vs.[%s]<br>\n",
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
900 pswd->pw_passwd, crypt(pass, pswd->pw_passwd)); */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
901 printf("UNIXパスワードと一致しません.<br>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
902 fflush(stdout);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
903 fail();
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
904 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
905 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
906
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
907 if (strlen(new) < 8 || strlen(new2) < 8) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
908 printf("New mail password must be more than 7 characters.<br>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
909 printf("メイルパスワードは8文字以上にしてください。<br>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
910 fflush(stdout);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
911 fail();
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
912 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
913 if (suffix[0]) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
914 argv = (char**)realloc(argv, (argc+3)*sizeof(char*));
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
915 argv[argc++] = "-e";
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
916 argv[argc++] = suffix;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
917
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
918 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
919 argv[argc++] = NULL;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
920 if (setgid(pswd->pw_gid) || 0 != setuid(pswd->pw_uid)) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
921 printf("Cannot switch to %s\n", user);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
922 printf("uid=%d, gid=%d<br>\n", pswd->pw_gid, pswd->pw_uid);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
923 printf("メイルパスワード変更サーバの設定不良の可能性があるので<br>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
924 printf("お手数ですがこの画面のコピーを添えてシステム管理者");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
925 printf("まで御連絡下さい。<br>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
926 fflush(stdout);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
927 fail();
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
928 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
929
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
930 /* OK, start apopasswd */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
931 if (pipe(tochild)+pipe(toparent)) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
932 printf("Cannot create pipe\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
933 fail();
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
934 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
935 if ((pid=fork()) > 0) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
936 FILE *child = fdopen(tochild[1], "w");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
937 close(tochild[0]);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
938 close(toparent[1]);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
939 fprintf(child, "PASS %s\nNEW %s\nNEW2 %s\n",
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
940 pass, new, new2);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
941 fflush(child);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
942 fclose(child);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
943
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
944 } else if (pid == -1) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
945 printf("Cannot fork\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
946 fail();
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
947 } else {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
948 char *pe = malloc(6+strlen(pswd->pw_dir));
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
949 close(tochild[1]);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
950 close(toparent[0]);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
951 dup2(tochild[0], 0);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
952 dup2(toparent[1], 1);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
953
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
954 /* setuid section */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
955
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
956 strcpy(pe, "HOME=");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
957 strcat(pe, pswd->pw_dir);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
958 if (putenv(pe)) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
959 puts("ga-n! arichan gakkari<br>");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
960 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
961 execv(APOPPASSWD, argv);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
962
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
963 /* setuid section ends */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
964 fprintf(stderr, "Cannot exec %s\n", APOPPASSWD);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
965 fail();
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
966 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
967 result = fdopen(toparent[0], "r");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
968 while (fgets(buf, BUFSIZ, result)) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
969 printf("%s<br>", buf);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
970 fflush(stdout);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
971 if (strstr(buf, "Success!")) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
972 printf("<br>Mail Password changed successfully!<br>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
973 sc++;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
974 break;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
975 } else if (strstr(buf, "mismatch")) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
976 printf("二個入れた新パスワードが一致しません.<br>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
977 break;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
978 } else if (strstr(buf, "Illegal")) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
979 printf("照合用パスワードが違います.<br>--\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
980 break;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
981 } else if (strstr(buf, "does not exist")) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
982 /* try_overwrite(user, pass, new, new2, suffix); */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
983 if (suffix[0]) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
984 printf("%s-%s", user, suffix);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
985 } else {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
986 printf("%s", user);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
987 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
988 /* ここは来ないことになった(のはず) */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
989 printf("というメイルアカウントは未作成です<br>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
990 printf("新規に作る場合はOKボタンをクリック\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
991 put_form(email, pass, new, new2, suffix, 1, 0, 1);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
992 fflush(stdout);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
993 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
994 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
995 fclose(result);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
996 while (wait(0) != pid) {sleep(1);fputc('.', stderr);}
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
997 if (sc) success(email); else fail();
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
998 } else if (user[0]) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
999 struct passwd *pw = getpwnam(user);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1000 int auth=0;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1001 if (!pw) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1002 printf("そのようなユーザはいません %s<br>\n", user);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1003 fail();
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1004 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1005 home=pw->pw_dir;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1006
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1007 printf("%s というメイルアドレスの<br>\n", email);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1008 printf("メイル専用パスワードを変更します.<br>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1009 printf("メイルパスワードとUNIXパスワードの違いに気をつけてください.<br>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1010 printf("新パスワードは8文字以上にしてください.<br>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1011 printf("New password must be more than or equal to 8 characters.<br>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1012 if (apopfile_existp(home, suffix, pw->pw_uid)) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1013 auth = 0; /* this password file */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1014 printf("「古いメイルパスワード」には、現在<br>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1015 printf("<tt>%s</tt><br>\n", email);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1016 printf("を読むために指定しているパスワードを入力します。");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1017 } else if (apopfile_existp(home, "", pw->pw_uid)) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1018 auth = 1; /* basic mail address password */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1019 printf("今回は本人認証として基本メイルアドレスのパスワードを");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1020 printf("入力しますが、新しくパスワードを設定するのは<br>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1021 printf("<tt>%s</tt><br>\n", email);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1022 printf("用のパスワードです。基本メイルアドレスのパスワードは");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1023 printf("変わりませんので注意してください。");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1024 } else {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1025 auth = 2; /* UNIX login */
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1026 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1027 put_form(email, "", "", "", suffix, 0, auth, 0);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1028 footer();
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1029 exit(0);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1030 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1031 printf("user=[%s]\n", user);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1032 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1033
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1034 int main(int argc, char* argv[]) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1035 char *method = getenv("REQUEST_METHOD");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1036 char **args;
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1037 myname = argv[0];
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1038 if (method && strcmp(method, "POST") != 0) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1039 printf("This program should be used in method:POST.\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1040 fail();
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1041 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1042 printf("Content-type: text/html; charset=EUC-JP\n\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1043 printf("<html>\n<head><title>Change Password</title></head>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1044 printf("<body style=\"background: #f0ffff;\">\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1045 if (getenv("SSL_CIPHER") && getenv("SSL_PROTOCOL")) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1046 args = decode_post();
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1047 apopcall(args);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1048 } else {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1049 printf("This program can be used only via SSL connection.<br>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1050 printf("このユーティリティはSSL接続時のみ有効です.<br>\n");
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1051 }
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
1052 }

yatex.org