summaryrefslogtreecommitdiff
path: root/usr.sbin/ppp/pap.c
diff options
context:
space:
mode:
authorbrian <brian@cvs.openbsd.org>1997-11-23 20:27:41 +0000
committerbrian <brian@cvs.openbsd.org>1997-11-23 20:27:41 +0000
commit2cb79b0580b6b5629530c4d142a73a9a654f282f (patch)
tree8b062ff5e99e22ec2c95145149e22b58b7fc0e22 /usr.sbin/ppp/pap.c
parent518c0071f44dfb9716d70e0d8781585db7a3bd7d (diff)
Import version 1.5 of ppp.
<sales> This is a user-level ppp implementation that uses the tun driver. It was originally created by a Japanese ISP. It's now piled with features. Check the man pages for details. </sales> The sources are identical to the ones in FreeBSD, except for the Makefile. IP aliasing (NAT) is disabled, and can be enabled by simply doing a ``make install'' of libalias, then rebuilding ppp. I'll create libalias as a port soon.
Diffstat (limited to 'usr.sbin/ppp/pap.c')
-rw-r--r--usr.sbin/ppp/pap.c216
1 files changed, 216 insertions, 0 deletions
diff --git a/usr.sbin/ppp/pap.c b/usr.sbin/ppp/pap.c
new file mode 100644
index 00000000000..51e1e0b1290
--- /dev/null
+++ b/usr.sbin/ppp/pap.c
@@ -0,0 +1,216 @@
+/*
+ * PPP PAP Module
+ *
+ * Written by Toshiharu OHNO (tony-o@iij.ad.jp)
+ *
+ * Copyright (C) 1993-94, Internet Initiative Japan, Inc.
+ * All rights reserverd.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the Internet Initiative Japan, Inc. The name of the
+ * IIJ may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Id: pap.c,v 1.1 1997/11/23 20:27:35 brian Exp $
+ *
+ * TODO:
+ */
+#include <sys/param.h>
+#include <netinet/in.h>
+
+#include <pwd.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+#ifdef __OpenBSD__
+#include <util.h>
+#else
+#include <libutil.h>
+#endif
+#include <utmp.h>
+
+#include "command.h"
+#include "mbuf.h"
+#include "log.h"
+#include "defs.h"
+#include "timer.h"
+#include "fsm.h"
+#include "lcp.h"
+#include "pap.h"
+#include "loadalias.h"
+#include "vars.h"
+#include "hdlc.h"
+#include "lcpproto.h"
+#include "phase.h"
+#include "auth.h"
+
+static const char *papcodes[] = { "???", "REQUEST", "ACK", "NAK" };
+
+static void
+SendPapChallenge(int papid)
+{
+ struct fsmheader lh;
+ struct mbuf *bp;
+ u_char *cp;
+ int namelen, keylen, plen;
+
+ namelen = strlen(VarAuthName);
+ keylen = strlen(VarAuthKey);
+ plen = namelen + keylen + 2;
+ LogPrintf(LogDEBUG, "SendPapChallenge: namelen = %d, keylen = %d\n",
+ namelen, keylen);
+ if (LogIsKept(LogDEBUG))
+ LogPrintf(LogPHASE, "PAP: %s (%s)\n", VarAuthName, VarAuthKey);
+ else
+ LogPrintf(LogPHASE, "PAP: %s\n", VarAuthName);
+ lh.code = PAP_REQUEST;
+ lh.id = papid;
+ lh.length = htons(plen + sizeof(struct fsmheader));
+ bp = mballoc(plen + sizeof(struct fsmheader), MB_FSM);
+ memcpy(MBUF_CTOP(bp), &lh, sizeof(struct fsmheader));
+ cp = MBUF_CTOP(bp) + sizeof(struct fsmheader);
+ *cp++ = namelen;
+ memcpy(cp, VarAuthName, namelen);
+ cp += namelen;
+ *cp++ = keylen;
+ memcpy(cp, VarAuthKey, keylen);
+
+ HdlcOutput(PRI_LINK, PROTO_PAP, bp);
+}
+
+struct authinfo AuthPapInfo = {
+ SendPapChallenge,
+};
+
+static void
+SendPapCode(int id, int code, const char *message)
+{
+ struct fsmheader lh;
+ struct mbuf *bp;
+ u_char *cp;
+ int plen, mlen;
+
+ lh.code = code;
+ lh.id = id;
+ mlen = strlen(message);
+ plen = mlen + 1;
+ lh.length = htons(plen + sizeof(struct fsmheader));
+ bp = mballoc(plen + sizeof(struct fsmheader), MB_FSM);
+ memcpy(MBUF_CTOP(bp), &lh, sizeof(struct fsmheader));
+ cp = MBUF_CTOP(bp) + sizeof(struct fsmheader);
+ *cp++ = mlen;
+ memcpy(cp, message, mlen);
+ LogPrintf(LogPHASE, "PapOutput: %s\n", papcodes[code]);
+ HdlcOutput(PRI_LINK, PROTO_PAP, bp);
+}
+
+/*
+ * Validate given username and passwrd against with secret table
+ */
+static int
+PapValidate(u_char * name, u_char * key)
+{
+ int nlen, klen;
+
+ nlen = *name++;
+ klen = *key;
+ *key++ = 0;
+ key[klen] = 0;
+ LogPrintf(LogDEBUG, "PapValidate: name %s (%d), key %s (%d)\n",
+ name, nlen, key, klen);
+
+#ifndef NOPASSWDAUTH
+ if (Enabled(ConfPasswdAuth)) {
+ struct passwd *pwd;
+ int result;
+
+ LogPrintf(LogLCP, "Using PasswdAuth\n");
+ result = (pwd = getpwnam(name)) &&
+ !strcmp(crypt(key, pwd->pw_passwd), pwd->pw_passwd);
+ endpwent();
+ return result;
+ }
+#endif
+
+ return (AuthValidate(SECRETFILE, name, key));
+}
+
+void
+PapInput(struct mbuf * bp)
+{
+ int len = plength(bp);
+ struct fsmheader *php;
+ struct lcpstate *lcp = &LcpInfo;
+ u_char *cp;
+
+ if (len >= sizeof(struct fsmheader)) {
+ php = (struct fsmheader *) MBUF_CTOP(bp);
+ if (len >= ntohs(php->length)) {
+ if (php->code < PAP_REQUEST || php->code > PAP_NAK)
+ php->code = 0;
+ LogPrintf(LogPHASE, "PapInput: %s\n", papcodes[php->code]);
+
+ switch (php->code) {
+ case PAP_REQUEST:
+ cp = (u_char *) (php + 1);
+ if (PapValidate(cp, cp + *cp + 1)) {
+ SendPapCode(php->id, PAP_ACK, "Greetings!!");
+ lcp->auth_ineed = 0;
+ if (lcp->auth_iwait == 0) {
+ if ((mode & MODE_DIRECT) && isatty(modem) && Enabled(ConfUtmp))
+ if (Utmp)
+ LogPrintf(LogERROR, "Oops, already logged in on %s\n",
+ VarBaseDevice);
+ else {
+ struct utmp ut;
+ memset(&ut, 0, sizeof(ut));
+ time(&ut.ut_time);
+ strncpy(ut.ut_name, cp+1, sizeof(ut.ut_name)-1);
+ strncpy(ut.ut_line, VarBaseDevice, sizeof(ut.ut_line)-1);
+ if (logout(ut.ut_line))
+ logwtmp(ut.ut_line, "", "");
+ login(&ut);
+ Utmp = 1;
+ }
+ NewPhase(PHASE_NETWORK);
+ }
+ } else {
+ SendPapCode(php->id, PAP_NAK, "Login incorrect");
+ reconnect(RECON_FALSE);
+ LcpClose();
+ }
+ break;
+ case PAP_ACK:
+ StopAuthTimer(&AuthPapInfo);
+ cp = (u_char *) (php + 1);
+ len = *cp++;
+ cp[len] = 0;
+ LogPrintf(LogPHASE, "Received PAP_ACK (%s)\n", cp);
+ if (lcp->auth_iwait == PROTO_PAP) {
+ lcp->auth_iwait = 0;
+ if (lcp->auth_ineed == 0)
+ NewPhase(PHASE_NETWORK);
+ }
+ break;
+ case PAP_NAK:
+ StopAuthTimer(&AuthPapInfo);
+ cp = (u_char *) (php + 1);
+ len = *cp++;
+ cp[len] = 0;
+ LogPrintf(LogPHASE, "Received PAP_NAK (%s)\n", cp);
+ reconnect(RECON_FALSE);
+ LcpClose();
+ break;
+ }
+ }
+ }
+ pfree(bp);
+}