Annotation of embedaddon/mpd/src/pap.c, revision 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>