Deleted Added
full compact
1/*
2 * PPP Secret Key Module
3 *
4 * Written by Toshiharu OHNO (tony-o@iij.ad.jp)
5 *
6 * Copyright (C) 1994, Internet Initiative Japan, Inc. All rights reserverd.
7 *
8 * Redistribution and use in source and binary forms are permitted
9 * provided that the above copyright notice and this paragraph are
10 * duplicated in all such forms and that any documentation,
11 * advertising materials, and other materials related to such
12 * distribution and use acknowledge that the software was developed
13 * by the Internet Initiative Japan, Inc. The name of the
14 * IIJ may not be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
18 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19 *
20 * $Id: auth.c,v 1.4 1995/05/30 03:50:25 rgrimes Exp $
20 * $Id: auth.c,v 1.5 1995/09/02 17:20:49 amurai Exp $
21 *
22 * TODO:
23 * o Implement check against with registered IP addresses.
24 */
25#include "fsm.h"
26#include "lcpproto.h"
27#include "ipcp.h"
28#include "vars.h"
29#include "filter.h"
30#include "auth.h"
31#include "chat.h"
32
33extern FILE *OpenSecret();
34extern void CloseSecret();
35
36LOCAL_AUTH_VALID
35LocalAuthInit(void){
37LocalAuthInit(void)
38{
39
40 char *p;
41
42 if ( gethostname( VarShortHost, sizeof(VarShortHost))) {
43 return(NOT_FOUND);
44 }
42 if ( p = strchr( VarShortHost, '.' ) )
45 p = strchr( VarShortHost, '.' );
46 if (p)
47 *p = '\0';
48
49 VarLocalAuth = LOCAL_NO_AUTH;
50 return LocalAuthValidate( SECRETFILE, VarShortHost, "" );
51
52}
53
54LOCAL_AUTH_VALID
55LocalAuthValidate( char *fname, char *system, char *key) {
56 FILE *fp;
57 int n;
58 char *vector[20]; /* XXX */
59 char buff[200]; /* XXX */
60 LOCAL_AUTH_VALID rc;
61
62 rc = NOT_FOUND; /* No system entry */
63 fp = OpenSecret(fname);
64 if (fp == NULL)
65 return( rc );
66 while (fgets(buff, sizeof(buff), fp)) {
67 if (buff[0] == '#')
68 continue;
69 buff[strlen(buff)-1] = 0;
70 bzero(vector, sizeof(vector));
67 n = MakeArgs(buff, &vector);
71 n = MakeArgs(buff, vector);
72 if (n < 1)
73 continue;
74 if (strcmp(vector[0], system) == 0) {
75 if ( vector[1] != (char *) NULL && strcmp(vector[1], key) == 0) {
76 rc = VALID; /* Valid */
77 } else {
78 rc = INVALID; /* Invalid */
79 }
80 break;
81 }
82 }
83 CloseSecret(fp);
84 return( rc );
85}
86
87int
88AuthValidate(fname, system, key)
89char *fname, *system, *key;
90{
91 FILE *fp;
92 int n;
93 char *vector[20];
94 char buff[200];
95 char passwd[100];
96
97 fp = OpenSecret(fname);
98 if (fp == NULL)
99 return(0);
100 while (fgets(buff, sizeof(buff), fp)) {
101 if (buff[0] == '#')
102 continue;
103 buff[strlen(buff)-1] = 0;
104 bzero(vector, sizeof(vector));
101 n = MakeArgs(buff, &vector);
105 n = MakeArgs(buff, vector);
106 if (n < 2)
107 continue;
108 if (strcmp(vector[0], system) == 0) {
109 ExpandString(vector[1], passwd, 0);
110 if (strcmp(passwd, key) == 0) {
111 CloseSecret(fp);
112 bzero(&DefHisAddress, sizeof(DefHisAddress));
113 n -= 2;
114 if (n > 0) {
115 ParseAddr(n--, &vector[2],
116 &DefHisAddress.ipaddr, &DefHisAddress.mask, &DefHisAddress.width);
117 }
118 IpcpInit();
119 return(1); /* Valid */
120 }
121 }
122 }
123 CloseSecret(fp);
124 return(0); /* Invalid */
125}
126
127char *
128AuthGetSecret(fname, system, len, setaddr)
129char *fname, *system;
130int len, setaddr;
131{
132 FILE *fp;
133 int n;
134 char *vector[20];
135 char buff[200];
136 static char passwd[100];
137
138 fp = OpenSecret(fname);
139 if (fp == NULL)
140 return(NULL);
141 while (fgets(buff, sizeof(buff), fp)) {
142 if (buff[0] == '#')
143 continue;
144 buff[strlen(buff)-1] = 0;
145 bzero(vector, sizeof(vector));
142 n = MakeArgs(buff, &vector);
146 n = MakeArgs(buff, vector);
147 if (n < 2)
148 continue;
149 if (strlen(vector[0]) == len && strncmp(vector[0], system, len) == 0) {
150 ExpandString(vector[1], passwd, 0);
151 if (setaddr) {
152 bzero(&DefHisAddress, sizeof(DefHisAddress));
153 }
154 n -= 2;
155 if (n > 0 && setaddr) {
156#ifdef DEBUG
157 LogPrintf(LOG_LCP, "*** n = %d, %s\n", n, vector[2]);
158#endif
159 ParseAddr(n--, &vector[2],
160 &DefHisAddress.ipaddr, &DefHisAddress.mask, &DefHisAddress.width);
161 IpcpInit();
162 }
163 return(passwd);
164 }
165 }
166 CloseSecret(fp);
167 return(NULL); /* Invalid */
168}
169
170static void
171AuthTimeout(authp)
172struct authinfo *authp;
173{
174 struct pppTimer *tp;
175
176 tp = &authp->authtimer;
177 StopTimer(tp);
178 if (--authp->retry > 0) {
179 StartTimer(tp);
180 (authp->ChallengeFunc)(++authp->id);
181 }
182}
183
184void
185StartAuthChallenge(authp)
186struct authinfo *authp;
187{
188 struct pppTimer *tp;
189
190 tp = &authp->authtimer;
191 StopTimer(tp);
192 tp->func = AuthTimeout;
193 tp->load = VarRetryTimeout * SECTICKS;
194 tp->state = TIMER_STOPPED;
195 tp->arg = (void *)authp;
196 StartTimer(tp);
197 authp->retry = 3;
198 authp->id = 1;
199 (authp->ChallengeFunc)(authp->id);
200}
201
202void
203StopAuthTimer(authp)
204struct authinfo *authp;
205{
206 StopTimer(&authp->authtimer);
207}