Annotation of embedaddon/mpd/src/pap.c, revision 1.1.1.1
1.1 misho 1:
2: /*
3: * pap.c
4: *
5: * Written by Toshiharu OHNO <tony-o@iij.ad.jp>
6: * Copyright (c) 1993, Internet Initiative Japan, Inc. All rights reserved.
7: * See ``COPYRIGHT.iij''
8: *
9: * Rewritten by Archie Cobbs <archie@freebsd.org>
10: * Copyright (c) 1995-1999 Whistle Communications, Inc. All rights reserved.
11: * See ``COPYRIGHT.whistle''
12: */
13:
14: #include "ppp.h"
15: #include "auth.h"
16: #include "util.h"
17:
18: /*
19: * INTERNAL FUNCTIONS
20: */
21:
22: static void PapSendRequest(Link l);
23: static void PapTimeout(void *ptr);
24:
25: /*
26: * PapStart()
27: */
28:
29: void
30: PapStart(Link l, int which)
31: {
32: PapInfo pap = &l->lcp.auth.pap;
33:
34: switch (which) {
35: case AUTH_PEER_TO_SELF: /* Just wait for peer's request */
36: break;
37:
38: case AUTH_SELF_TO_PEER:
39:
40: /* Initialize retry counter and timer */
41: pap->next_id = 1;
42: pap->retry = AUTH_RETRIES;
43:
44: TimerInit(&pap->timer, "PapTimer",
45: l->conf.retry_timeout * SECONDS, PapTimeout, l);
46: TimerStart(&pap->timer);
47:
48: /* Send first request */
49: PapSendRequest(l);
50: break;
51:
52: default:
53: assert(0);
54: }
55: }
56:
57: /*
58: * PapStop()
59: */
60:
61: void
62: PapStop(PapInfo pap)
63: {
64: TimerStop(&pap->timer);
65: }
66:
67: /*
68: * PapSendRequest()
69: *
70: * Send a PAP packet to peer.
71: */
72:
73: static void
74: PapSendRequest(Link l)
75: {
76: PapInfo pap = &l->lcp.auth.pap;
77: char password[AUTH_MAX_PASSWORD];
78: int name_len, pass_len;
79: u_char *pkt;
80:
81: /* Get password corresponding to my authname */
82: Log(LG_AUTH, ("[%s] PAP: using authname \"%s\"",
83: l->name, l->lcp.auth.conf.authname));
84: if (l->lcp.auth.conf.password[0] != 0) {
85: strlcpy(password, l->lcp.auth.conf.password, sizeof(password));
86: } else if (AuthGetData(l->lcp.auth.conf.authname, password,
87: sizeof(password), NULL, NULL) < 0) {
88: Log(LG_AUTH, ("[%s] PAP: Warning: no secret for \"%s\" found",
89: l->name, l->lcp.auth.conf.authname));
90: }
91:
92: /* Build response packet */
93: name_len = strlen(l->lcp.auth.conf.authname);
94: pass_len = strlen(password);
95:
96: pkt = Malloc(MB_AUTH, 1 + name_len + 1 + pass_len);
97: pkt[0] = name_len;
98: memcpy(pkt + 1, l->lcp.auth.conf.authname, name_len);
99: pkt[1 + name_len] = pass_len;
100: memcpy(pkt + 1 + name_len + 1, password, pass_len);
101:
102: /* Send it off */
103: AuthOutput(l, PROTO_PAP, PAP_REQUEST, pap->next_id++, pkt,
104: 1 + name_len + 1 + pass_len, 0, 0);
105: Freee(pkt);
106: }
107:
108: /*
109: * PapInput()
110: *
111: * Accept an incoming PAP packet
112: */
113:
114: void
115: PapInput(Link l, AuthData auth, const u_char *pkt, u_short len)
116: {
117: Auth const a = &l->lcp.auth;
118: PapInfo const pap = &a->pap;
119: PapParams const pp = &auth->params.pap;
120: char failMesg[64];
121: char buf[16];
122:
123: switch (auth->code) {
124: case PAP_REQUEST:
125: {
126: char *name_ptr, name[256];
127: char *pass_ptr, pass[256];
128: int name_len, pass_len;
129:
130: /* Is this appropriate? */
131: if (a->peer_to_self != PROTO_PAP) {
132: if (l->lcp.want_auth == PROTO_PAP && a->peer_to_self == 0) {
133: Log(LG_AUTH, ("[%s] PAP: retransmitting ACK",
134: l->name));
135: AuthOutput(l, PROTO_PAP, PAP_ACK, auth->id,
136: (u_char *) AUTH_MSG_WELCOME, strlen(AUTH_MSG_WELCOME), 1, 0);
137: break;
138: }
139: Log(LG_AUTH, ("[%s] PAP: %s not expected",
140: l->name, PapCode(auth->code, buf, sizeof(buf))));
141: auth->why_fail = AUTH_FAIL_NOT_EXPECTED;
142: PapInputFinish(l, auth);
143: return;
144: }
145:
146: /* Sanity check packet and extract fields */
147: if (len < 1)
148: goto error;
149:
150: name_len = pkt[0];
151: name_ptr = (char *)pkt + 1;
152:
153: if (1 + name_len >= len)
154: goto error;
155:
156: pass_len = pkt[1 + name_len];
157: pass_ptr = (char *)pkt + 1 + name_len + 1;
158:
159: if (name_len + 1 + pass_len + 1 > len)
160: goto error;
161:
162: memcpy(name, name_ptr, name_len);
163: name[name_len] = 0;
164: memcpy(pass, pass_ptr, pass_len);
165: pass[pass_len] = 0;
166:
167: strlcpy(pp->peer_name, name, sizeof(pp->peer_name));
168: strlcpy(pp->peer_pass, pass, sizeof(pp->peer_pass));
169: strlcpy(auth->params.authname, name, sizeof(auth->params.authname));
170: auth->params.password[0] = 0;
171:
172: auth->finish = PapInputFinish;
173: AuthAsyncStart(l, auth);
174: return;
175: }
176: break;
177:
178: case PAP_ACK:
179: case PAP_NAK:
180: {
181: /* Is this appropriate? */
182: if (a->self_to_peer != PROTO_PAP) {
183: Log(LG_AUTH, ("[%s] PAP: %s not expected",
184: l->name, PapCode(auth->code, buf, sizeof(buf))));
185: break;
186: }
187:
188: /* Stop resend timer */
189: TimerStop(&pap->timer);
190:
191: /* Show reply message */
192: if (len > 0) {
193: int msg_len = pkt[0];
194: char *msg = (char *) &pkt[1];
195: if (msg_len < len - 1)
196: msg_len = len - 1;
197: ShowMesg(LG_AUTH, l->name, msg, msg_len);
198: }
199:
200: /* Done with my auth to peer */
201: AuthFinish(l, AUTH_SELF_TO_PEER, auth->code == PAP_ACK);
202: }
203: break;
204:
205: default:
206: Log(LG_AUTH, ("[%s] PAP: unknown code", l->name));
207: break;
208: }
209: AuthDataDestroy(auth);
210: return;
211:
212: error:
213: Log(LG_AUTH, ("[%s] PAP: Bad PAP packet", l->name));
214: auth->why_fail = AUTH_FAIL_INVALID_PACKET;
215: AuthFailMsg(auth, failMesg, sizeof(failMesg));
216: AuthOutput(l, PROTO_PAP, PAP_NAK, auth->id, (u_char *)failMesg, strlen(failMesg), 1, 0);
217: AuthFinish(l, AUTH_PEER_TO_SELF, FALSE);
218: AuthDataDestroy(auth);
219: }
220:
221: /*
222: * PapInputFinish()
223: *
224: * Possible return point from the asynch auth handler.
225: *
226: */
227:
228: void PapInputFinish(Link l, AuthData auth)
229: {
230: Auth const a = &l->lcp.auth;
231: PapParams pap = &a->params.pap;
232: const char *Mesg;
233:
234: Log(LG_AUTH, ("[%s] PAP: Auth return status: %s",
235: l->name, AuthStatusText(auth->status)));
236:
237: if (auth->status == AUTH_STATUS_BUSY) {
238: AuthDataDestroy(auth);
239: return;
240: } else if (auth->status == AUTH_STATUS_FAIL)
241: goto badRequest;
242: else if (auth->status == AUTH_STATUS_SUCCESS)
243: goto goodRequest;
244:
245: /* Do name & password match? */
246: if (strcmp(a->params.authname, pap->peer_name) ||
247: strcmp(a->params.password, pap->peer_pass)) {
248: Log(LG_AUTH, ("[%s] PAP: Invalid response", l->name));
249: auth->why_fail = AUTH_FAIL_INVALID_LOGIN;
250: goto badRequest;
251: }
252:
253: goodRequest:
254: /* Login accepted */
255: Log(LG_AUTH, ("[%s] PAP: Response is valid", l->name));
256: if (auth->reply_message) {
257: Mesg = auth->reply_message;
258: } else {
259: Mesg = AUTH_MSG_WELCOME;
260: }
261: Log(LG_AUTH, ("[%s] PAP: Reply message: %s", l->name, Mesg));
262: AuthOutput(l, PROTO_PAP, PAP_ACK, auth->id, (u_char *) Mesg, strlen(Mesg), 1, 0);
263: AuthFinish(l, AUTH_PEER_TO_SELF, TRUE);
264: AuthDataDestroy(auth);
265: return;
266:
267: badRequest:
268: {
269: char failMesg[64];
270:
271: Mesg = AuthFailMsg(auth, failMesg, sizeof(failMesg));
272: Log(LG_AUTH, ("[%s] PAP: Reply message: %s", l->name, Mesg));
273: AuthOutput(l, PROTO_PAP, PAP_NAK, auth->id, (u_char *) Mesg, strlen(Mesg), 1, 0);
274: AuthFinish(l, AUTH_PEER_TO_SELF, FALSE);
275: AuthDataDestroy(auth);
276: }
277: }
278:
279: /*
280: * PapTimeout()
281: *
282: * Timer expired for reply to our request
283: */
284:
285: static void
286: PapTimeout(void *ptr)
287: {
288: Link const l = (Link) ptr;
289: PapInfo const pap = &l->lcp.auth.pap;
290:
291: if (--pap->retry > 0) {
292: TimerStart(&pap->timer);
293: PapSendRequest(l);
294: }
295: }
296:
297: /*
298: * PapCode()
299: */
300:
301: const char *
302: PapCode(int code, char *buf, size_t len)
303: {
304: switch (code) {
305: case PAP_REQUEST:
306: strlcpy(buf, "REQUEST", len);
307: break;
308: case PAP_ACK:
309: strlcpy(buf, "ACK", len);
310: break;
311: case PAP_NAK:
312: strlcpy(buf, "NAK", len);
313: break;
314: default:
315: snprintf(buf, len, "code%d", code);
316: }
317: return(buf);
318: }
319:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>