71 #include "netif/ppp/ppp_opts.h" 83 #include <sys/types.h> 88 #if defined(_PATH_LASTLOG) && defined(__linux__) 93 #include <netinet/in.h> 94 #include <arpa/inet.h> 99 #define PW_PPP PW_LOGIN 106 #include "netif/ppp/ppp_impl.h" 108 #include "netif/ppp/fsm.h" 109 #include "netif/ppp/lcp.h" 111 #include "netif/ppp/ccp.h" 114 #include "netif/ppp/ecp.h" 116 #include "netif/ppp/ipcp.h" 118 #include "netif/ppp/upap.h" 121 #include "netif/ppp/chap-new.h" 124 #include "netif/ppp/eap.h" 127 #include "netif/ppp/cbcp.h" 136 #define NONWILD_SERVER 1 137 #define NONWILD_CLIENT 2 139 #define ISWILD(word) (word[0] == '*' && word[1] == 0) 144 static struct permitted_ip *addresses[NUM_PPP];
148 static struct wordlist *noauth_addrs;
151 char remote_number[MAXNAMELEN];
154 static struct wordlist *permitted_numbers;
157 static struct wordlist *extra_options;
162 static bool default_auth;
165 int (*idle_time_hook) (
struct ppp_idle *) = NULL;
168 int (*pap_check_hook) (void) = NULL;
171 int (*pap_auth_hook) (
char *user,
char *passwd,
char **msgp,
172 struct wordlist **paddrs,
173 struct wordlist **popts) = NULL;
176 void (*pap_logout_hook) (void) = NULL;
179 int (*pap_passwd_hook) (
char *user,
char *passwd) = NULL;
182 int (*chap_check_hook) (void) = NULL;
185 int (*chap_passwd_hook) (
char *user,
char *passwd) = NULL;
189 int (*null_auth_hook) (
struct wordlist **paddrs,
190 struct wordlist **popts) = NULL;
192 int (*allowed_address_hook) (u32_t addr) = NULL;
195 #ifdef HAVE_MULTILINK 197 void (*multilink_join_hook) (void) = NULL;
203 struct notifier *auth_up_notifier = NULL;
206 struct notifier *link_down_notifier = NULL;
214 bool session_mgmt = 0;
217 bool refuse_chap = 0;
220 bool refuse_mschap = 0;
221 bool refuse_mschap_v2 = 0;
223 bool refuse_mschap = 1;
224 bool refuse_mschap_v2 = 1;
226 bool usehostname = 0;
227 bool auth_required = 0;
228 bool allow_any_ip = 0;
229 bool explicit_remote = 0;
230 bool explicit_user = 0;
231 bool explicit_passwd = 0;
232 char remote_name[MAXNAMELEN];
233 static char *uafname;
235 extern char *crypt (
const char *,
const char *);
239 static void network_phase(ppp_pcb *pcb);
240 #if PPP_IDLETIMELIMIT 241 static void check_idle(
void *arg);
244 static void connect_time_expired(
void *arg);
247 static int null_login (
int);
249 static int have_pap_secret (
int *);
250 static int have_chap_secret (
char *,
char *,
int,
int *);
251 static int have_srp_secret (
char *client,
char *server,
int need_ip,
253 static int ip_addr_check (u32_t,
struct permitted_ip *);
254 static int scan_authfile (
FILE *,
char *,
char *,
char *,
255 struct wordlist **,
struct wordlist **,
257 static void free_wordlist (
struct wordlist *);
258 static void set_allowed_addrs (
int,
struct wordlist *,
struct wordlist *);
259 static int some_ip_ok (
struct wordlist *);
260 static int setupapfile (
char **);
261 static int privgroup (
char **);
262 static int set_noauth_addr (
char **);
263 static int set_permitted_number (
char **);
264 static void check_access (
FILE *,
char *);
265 static int wordlist_count (
struct wordlist *);
269 static void check_maxoctets (
void *);
276 option_t auth_options[] = {
277 {
"auth", o_bool, &auth_required,
278 "Require authentication from peer", OPT_PRIO | 1 },
279 {
"noauth", o_bool, &auth_required,
280 "Don't require peer to authenticate", OPT_PRIOSUB | OPT_PRIV,
282 {
"require-pap", o_bool, &lcp_wantoptions[0].neg_upap,
283 "Require PAP authentication from peer",
284 OPT_PRIOSUB | 1, &auth_required },
285 {
"+pap", o_bool, &lcp_wantoptions[0].neg_upap,
286 "Require PAP authentication from peer",
287 OPT_ALIAS | OPT_PRIOSUB | 1, &auth_required },
288 {
"require-chap", o_bool, &auth_required,
289 "Require CHAP authentication from peer",
290 OPT_PRIOSUB | OPT_A2OR | MDTYPE_MD5,
291 &lcp_wantoptions[0].chap_mdtype },
292 {
"+chap", o_bool, &auth_required,
293 "Require CHAP authentication from peer",
294 OPT_ALIAS | OPT_PRIOSUB | OPT_A2OR | MDTYPE_MD5,
295 &lcp_wantoptions[0].chap_mdtype },
297 {
"require-mschap", o_bool, &auth_required,
298 "Require MS-CHAP authentication from peer",
299 OPT_PRIOSUB | OPT_A2OR | MDTYPE_MICROSOFT,
300 &lcp_wantoptions[0].chap_mdtype },
301 {
"+mschap", o_bool, &auth_required,
302 "Require MS-CHAP authentication from peer",
303 OPT_ALIAS | OPT_PRIOSUB | OPT_A2OR | MDTYPE_MICROSOFT,
304 &lcp_wantoptions[0].chap_mdtype },
305 {
"require-mschap-v2", o_bool, &auth_required,
306 "Require MS-CHAPv2 authentication from peer",
307 OPT_PRIOSUB | OPT_A2OR | MDTYPE_MICROSOFT_V2,
308 &lcp_wantoptions[0].chap_mdtype },
309 {
"+mschap-v2", o_bool, &auth_required,
310 "Require MS-CHAPv2 authentication from peer",
311 OPT_ALIAS | OPT_PRIOSUB | OPT_A2OR | MDTYPE_MICROSOFT_V2,
312 &lcp_wantoptions[0].chap_mdtype },
315 {
"refuse-pap", o_bool, &refuse_pap,
316 "Don't agree to auth to peer with PAP", 1 },
317 {
"-pap", o_bool, &refuse_pap,
318 "Don't allow PAP authentication with peer", OPT_ALIAS | 1 },
319 {
"refuse-chap", o_bool, &refuse_chap,
320 "Don't agree to auth to peer with CHAP",
321 OPT_A2CLRB | MDTYPE_MD5,
322 &lcp_allowoptions[0].chap_mdtype },
323 {
"-chap", o_bool, &refuse_chap,
324 "Don't allow CHAP authentication with peer",
325 OPT_ALIAS | OPT_A2CLRB | MDTYPE_MD5,
326 &lcp_allowoptions[0].chap_mdtype },
330 {
"refuse-mschap", o_bool, &refuse_mschap,
331 "Don't agree to auth to peer with MS-CHAP",
332 OPT_A2CLRB | MDTYPE_MICROSOFT,
333 &lcp_allowoptions[0].chap_mdtype },
334 {
"-mschap", o_bool, &refuse_mschap,
335 "Don't allow MS-CHAP authentication with peer",
336 OPT_ALIAS | OPT_A2CLRB | MDTYPE_MICROSOFT,
337 &lcp_allowoptions[0].chap_mdtype },
338 {
"refuse-mschap-v2", o_bool, &refuse_mschap_v2,
339 "Don't agree to auth to peer with MS-CHAPv2",
340 OPT_A2CLRB | MDTYPE_MICROSOFT_V2,
341 &lcp_allowoptions[0].chap_mdtype },
342 {
"-mschap-v2", o_bool, &refuse_mschap_v2,
343 "Don't allow MS-CHAPv2 authentication with peer",
344 OPT_ALIAS | OPT_A2CLRB | MDTYPE_MICROSOFT_V2,
345 &lcp_allowoptions[0].chap_mdtype },
349 {
"require-eap", o_bool, &lcp_wantoptions[0].neg_eap,
350 "Require EAP authentication from peer", OPT_PRIOSUB | 1,
353 {
"refuse-eap", o_bool, &refuse_eap,
354 "Don't agree to authenticate to peer with EAP", 1 },
357 {
"name", o_string, our_name,
358 "Set local name for authentication",
359 OPT_PRIO | OPT_PRIV | OPT_STATIC, NULL, MAXNAMELEN },
361 {
"+ua", o_special, (
void *)setupapfile,
362 "Get PAP user and password from file",
363 OPT_PRIO | OPT_A2STRVAL, &uafname },
366 {
"user", o_string, user,
367 "Set name for auth with peer", OPT_PRIO | OPT_STATIC,
368 &explicit_user, MAXNAMELEN },
370 {
"password", o_string, passwd,
371 "Password for authenticating us to the peer",
372 OPT_PRIO | OPT_STATIC | OPT_HIDE,
373 &explicit_passwd, MAXSECRETLEN },
376 {
"usehostname", o_bool, &usehostname,
377 "Must use hostname for authentication", 1 },
379 {
"remotename", o_string, remote_name,
380 "Set remote name for authentication", OPT_PRIO | OPT_STATIC,
381 &explicit_remote, MAXNAMELEN },
383 {
"login", o_bool, &uselogin,
384 "Use system password database for PAP", OPT_A2COPY | 1 ,
386 {
"enable-session", o_bool, &session_mgmt,
387 "Enable session accounting for remote peers", OPT_PRIV | 1 },
389 {
"papcrypt", o_bool, &cryptpap,
390 "PAP passwords are encrypted", 1 },
392 {
"privgroup", o_special, (
void *)privgroup,
393 "Allow group members to use privileged options", OPT_PRIV | OPT_A2LIST },
395 {
"allow-ip", o_special, (
void *)set_noauth_addr,
396 "Set IP address(es) which can be used without authentication",
397 OPT_PRIV | OPT_A2LIST },
399 {
"remotenumber", o_string, remote_number,
400 "Set remote telephone number for authentication", OPT_PRIO | OPT_STATIC,
403 {
"allow-number", o_special, (
void *)set_permitted_number,
404 "Set telephone number(s) which are allowed to connect",
405 OPT_PRIV | OPT_A2LIST },
422 char u[MAXNAMELEN], p[MAXSECRETLEN];
425 lcp_allowoptions[0].neg_upap = 1;
428 fname = strdup(*argv);
430 novm(
"+ua file name");
432 if (seteuid(getuid()) == -1) {
433 option_error(
"unable to reset uid before opening %s: %m", fname);
436 ufile = fopen(fname,
"r");
437 if (seteuid(euid) == -1)
438 fatal(
"unable to regain privileges: %m");
440 option_error(
"unable to open user login data file %s", fname);
443 check_access(ufile, fname);
447 if (fgets(u, MAXNAMELEN - 1, ufile) == NULL
448 || fgets(p, MAXSECRETLEN - 1, ufile) == NULL) {
450 option_error(
"unable to read user login data file %s", fname);
457 if (l > 0 && u[l-1] ==
'\n')
460 if (l > 0 && p[l-1] ==
'\n')
463 if (override_value(
"user", option_priority, fname)) {
464 strlcpy(ppp_settings.user, u,
sizeof(ppp_settings.user));
467 if (override_value(
"passwd", option_priority, fname)) {
468 strlcpy(ppp_settings.passwd, p,
sizeof(ppp_settings.passwd));
487 option_error(
"group %s is unknown", *argv);
490 for (i = 0; i < ngroups; ++i) {
491 if (groups[i] == g->gr_gid) {
505 set_noauth_addr(argv)
509 int l = strlen(addr) + 1;
512 wp = (
struct wordlist *) malloc(
sizeof(
struct wordlist) + l);
514 novm(
"allow-ip argument");
515 wp->word = (
char *) (wp + 1);
516 wp->next = noauth_addrs;
517 MEMCPY(wp->word, addr, l);
527 set_permitted_number(argv)
530 char *number = *argv;
531 int l = strlen(number) + 1;
534 wp = (
struct wordlist *) malloc(
sizeof(
struct wordlist) + l);
536 novm(
"allow-number argument");
537 wp->word = (
char *) (wp + 1);
538 wp->next = permitted_numbers;
539 MEMCPY(wp->word, number, l);
540 permitted_numbers = wp;
548 void link_required(ppp_pcb *pcb) {
556 void start_link(unit)
559 ppp_pcb *pcb = &ppp_pcb_list[unit];
562 status = EXIT_NEGOTIATION_FAILED;
563 new_phase(pcb, PPP_PHASE_SERIALCONN);
566 devfd = the_channel->connect();
567 msg =
"Connect script failed";
579 fd_ppp = the_channel->establish_ppp(devfd);
580 msg =
"ppp establishment failed";
582 status = EXIT_FATAL_ERROR;
586 if (!demand && ifunit >= 0)
594 ppp_notice(
"Connect: %s <--> %s", ifname, ppp_devnam);
596 ppp_notice(
"Starting negotiation on %s", ppp_devnam);
599 new_phase(pcb, PPP_PHASE_ESTABLISH);
605 new_phase(pcb, PPP_PHASE_DISCONNECT);
606 if (the_channel->disconnect)
607 the_channel->disconnect();
610 new_phase(pcb, PPP_PHASE_DEAD);
611 if (the_channel->cleanup)
612 (*the_channel->cleanup)();
620 void link_terminated(ppp_pcb *pcb) {
621 if (pcb->phase == PPP_PHASE_DEAD
622 #ifdef HAVE_MULTILINK
623 || pcb->phase == PPP_PHASE_MASTER
627 new_phase(pcb, PPP_PHASE_DISCONNECT);
630 if (pap_logout_hook) {
636 if (!doing_multilink) {
637 ppp_notice(
"Connection terminated.");
638 #if PPP_STATS_SUPPORT 642 ppp_notice(
"Link terminated.");
646 ppp_link_terminated(pcb);
653 if (!doing_multilink && !demand)
664 the_channel->disestablish_ppp(devfd);
671 if (!doing_multilink && !demand)
672 script_unsetenv(
"IFNAME");
678 if (devfd >= 0 && the_channel->disconnect) {
679 the_channel->disconnect();
682 if (the_channel->cleanup)
683 (*the_channel->cleanup)();
685 if (doing_multilink && multilink_master) {
686 if (!bundle_terminating)
687 new_phase(pcb, PPP_PHASE_MASTER);
689 mp_bundle_terminated();
691 new_phase(pcb, PPP_PHASE_DEAD);
698 void link_down(ppp_pcb *pcb) {
700 notify(link_down_notifier, 0);
703 if (!doing_multilink) {
704 upper_layers_down(pcb);
705 if (pcb->phase != PPP_PHASE_DEAD
706 #ifdef HAVE_MULTILINK
707 && pcb->phase != PPP_PHASE_MASTER
710 new_phase(pcb, PPP_PHASE_ESTABLISH);
716 void upper_layers_down(ppp_pcb *pcb) {
718 const struct protent *protp;
720 for (i = 0; (protp = protocols[i]) != NULL; ++i) {
721 if (protp->protocol != PPP_LCP && protp->lowerdown != NULL)
722 (*protp->lowerdown)(pcb);
723 if (protp->protocol < 0xC000 && protp->close != NULL)
724 (*protp->close)(pcb,
"LCP down");
726 pcb->num_np_open = 0;
734 void link_established(ppp_pcb *pcb) {
739 lcp_options *wo = &pcb->lcp_wantoptions;
741 lcp_options *go = &pcb->lcp_gotoptions;
743 lcp_options *ho = &pcb->lcp_hisoptions;
746 const struct protent *protp;
751 if (!doing_multilink) {
752 for (i = 0; (protp = protocols[i]) != NULL; ++i)
753 if (protp->protocol != PPP_LCP
754 && protp->lowerup != NULL)
755 (*protp->lowerup)(pcb);
760 #if PPP_ALLOWED_ADDRS 761 if (!auth_required && noauth_addrs != NULL)
762 set_allowed_addrs(unit, NULL, NULL);
765 if (pcb->settings.auth_required && !(0
777 #if PPP_ALLOWED_ADDRS 785 if (noauth_addrs != NULL) {
786 set_allowed_addrs(unit, NULL, NULL);
789 if (!pcb->settings.null_login
794 ppp_warn(
"peer refused to authenticate: terminating link");
796 status = EXIT_PEER_AUTH_FAILED;
798 pcb->err_code = PPPERR_AUTHFAIL;
799 lcp_close(pcb,
"peer refused to authenticate");
805 new_phase(pcb, PPP_PHASE_AUTHENTICATE);
810 eap_authpeer(pcb, PPP_OUR_NAME);
816 chap_auth_peer(pcb, PPP_OUR_NAME, CHAP_DIGEST(go->chap_mdtype));
831 eap_authwithpeer(pcb, pcb->settings.user);
832 auth |= EAP_WITHPEER;
837 chap_auth_with_peer(pcb, pcb->settings.user, CHAP_DIGEST(ho->chap_mdtype));
838 auth |= CHAP_WITHPEER;
843 upap_authwithpeer(pcb, pcb->settings.user, pcb->settings.passwd);
844 auth |= PAP_WITHPEER;
849 pcb->auth_pending = auth;
860 static void network_phase(ppp_pcb *pcb) {
862 ppp_pcb *pcb = &ppp_pcb_list[unit];
865 lcp_options *go = &lcp_gotoptions[unit];
871 ppp_notice(
"peer from calling number %q authorized", remote_number);
889 notify(auth_up_notifier, 0);
898 new_phase(pcb, PPP_PHASE_CALLBACK);
899 (*cbcp_protent.open)(pcb);
909 options_from_list(extra_options, 1);
910 free_wordlist(extra_options);
917 void start_networks(ppp_pcb *pcb) {
918 #if CCP_SUPPORT || ECP_SUPPORT 920 const struct protent *protp;
923 new_phase(pcb, PPP_PHASE_NETWORK);
925 #ifdef HAVE_MULTILINK 927 if (mp_join_bundle()) {
928 if (multilink_join_hook)
929 (*multilink_join_hook)();
930 if (updetach && !nodetach)
939 set_filters(&pass_filter, &active_filter);
941 #if CCP_SUPPORT || ECP_SUPPORT 943 for (i = 0; (protp = protocols[i]) != NULL; ++i)
947 || protp->protocol == PPP_ECP
950 || protp->protocol == PPP_CCP
953 && protp->open != NULL)
962 && !ecp_gotoptions[unit].required
965 && !pcb->ccp_gotoptions.mppe
968 continue_networks(pcb);
971 void continue_networks(ppp_pcb *pcb) {
973 const struct protent *protp;
978 for (i = 0; (protp = protocols[i]) != NULL; ++i)
979 if (protp->protocol < 0xC000
981 && protp->protocol != PPP_CCP
984 && protp->protocol != PPP_ECP
986 && protp->open != NULL) {
991 if (pcb->num_np_open == 0)
993 lcp_close(pcb,
"No network protocols running");
1006 int auth_check_passwd(ppp_pcb *pcb,
char *auser,
int userlen,
char *apasswd,
int passwdlen,
const char **msg,
int *msglen) {
1008 int secretpasswdlen;
1010 if (pcb->settings.user && pcb->settings.passwd) {
1011 secretuserlen = (int)strlen(pcb->settings.user);
1012 secretpasswdlen = (int)strlen(pcb->settings.passwd);
1013 if (secretuserlen == userlen
1014 && secretpasswdlen == passwdlen
1015 && !memcmp(auser, pcb->settings.user, userlen)
1016 && !memcmp(apasswd, pcb->settings.passwd, passwdlen) ) {
1018 *msglen =
sizeof(
"Login ok")-1;
1023 *msg =
"Login incorrect";
1024 *msglen =
sizeof(
"Login incorrect")-1;
1031 void auth_peer_fail(ppp_pcb *pcb,
int protocol) {
1037 status = EXIT_PEER_AUTH_FAILED;
1039 pcb->err_code = PPPERR_AUTHFAIL;
1040 lcp_close(pcb,
"Authentication failed");
1046 void auth_peer_success(ppp_pcb *pcb,
int protocol,
int prot_flavor,
const char *name,
int namelen) {
1048 #ifndef HAVE_MULTILINK 1057 switch (prot_flavor) {
1059 bit |= CHAP_MD5_PEER;
1062 case CHAP_MICROSOFT:
1063 bit |= CHAP_MS_PEER;
1065 case CHAP_MICROSOFT_V2:
1066 bit |= CHAP_MS2_PEER;
1085 ppp_warn(
"auth_peer_success: unknown protocol %x", protocol);
1089 #ifdef HAVE_MULTILINK 1093 if (namelen > (
int)
sizeof(pcb->peer_authname) - 1)
1094 namelen = (int)
sizeof(pcb->peer_authname) - 1;
1095 MEMCPY(pcb->peer_authname, name, namelen);
1096 pcb->peer_authname[namelen] = 0;
1099 script_setenv(
"PEERNAME", , 0);
1103 pcb->auth_done |= bit;
1109 if ((pcb->auth_pending &= ~bit) == 0)
1117 void auth_withpeer_fail(ppp_pcb *pcb,
int protocol) {
1129 pcb->err_code = PPPERR_AUTHFAIL;
1130 lcp_close(pcb,
"Failed to authenticate ourselves to peer");
1136 void auth_withpeer_success(ppp_pcb *pcb,
int protocol,
int prot_flavor) {
1138 const char *prot =
"";
1143 bit = CHAP_WITHPEER;
1145 switch (prot_flavor) {
1147 bit |= CHAP_MD5_WITHPEER;
1150 case CHAP_MICROSOFT:
1151 bit |= CHAP_MS_WITHPEER;
1153 case CHAP_MICROSOFT_V2:
1154 bit |= CHAP_MS2_WITHPEER;
1175 ppp_warn(
"auth_withpeer_success: unknown protocol %x", protocol);
1180 ppp_notice(
"%s authentication succeeded", prot);
1183 pcb->auth_done |= bit;
1189 if ((pcb->auth_pending &= ~bit) == 0)
1198 void np_up(ppp_pcb *pcb,
int proto) {
1199 #if PPP_IDLETIMELIMIT 1204 if (pcb->num_np_up == 0) {
1208 new_phase(pcb, PPP_PHASE_RUNNING);
1210 #if PPP_IDLETIMELIMIT 1212 if (idle_time_hook != 0)
1213 tlim = (*idle_time_hook)(NULL);
1216 tlim = pcb->settings.idle_time_limit;
1218 TIMEOUT(check_idle, (
void*)pcb, tlim);
1226 if (pcb->settings.maxconnect > 0)
1227 TIMEOUT(connect_time_expired, (
void*)pcb, pcb->settings.maxconnect);
1232 TIMEOUT(check_maxoctets, NULL, maxoctets_timeout);
1239 if (updetach && !nodetach)
1249 void np_down(ppp_pcb *pcb,
int proto) {
1251 if (--pcb->num_np_up == 0) {
1252 #if PPP_IDLETIMELIMIT 1253 UNTIMEOUT(check_idle, (
void*)pcb);
1256 UNTIMEOUT(connect_time_expired, NULL);
1259 UNTIMEOUT(check_maxoctets, NULL);
1261 new_phase(pcb, PPP_PHASE_NETWORK);
1268 void np_finished(ppp_pcb *pcb,
int proto) {
1270 if (--pcb->num_np_open <= 0) {
1272 lcp_close(pcb,
"No network protocols running");
1278 check_maxoctets(arg)
1281 #if PPP_STATS_SUPPORT 1284 update_link_stats(ifunit);
1287 switch(maxoctets_dir) {
1288 case PPP_OCTETS_DIRECTION_IN:
1289 used = link_stats.bytes_in;
1291 case PPP_OCTETS_DIRECTION_OUT:
1292 used = link_stats.bytes_out;
1294 case PPP_OCTETS_DIRECTION_MAXOVERAL:
1295 case PPP_OCTETS_DIRECTION_MAXSESSION:
1296 used = (link_stats.bytes_in > link_stats.bytes_out) ? link_stats.bytes_in : link_stats.bytes_out;
1299 used = link_stats.bytes_in+link_stats.bytes_out;
1302 if (used > maxoctets) {
1303 ppp_notice(
"Traffic limit reached. Limit: %u Used: %u", maxoctets, used);
1304 status = EXIT_TRAFFIC_LIMIT;
1305 lcp_close(pcb,
"Traffic limit");
1310 TIMEOUT(check_maxoctets, NULL, maxoctets_timeout);
1316 #if PPP_IDLETIMELIMIT 1321 static void check_idle(
void *arg) {
1322 ppp_pcb *pcb = (ppp_pcb*)arg;
1323 struct ppp_idle idle;
1327 if (!get_idle_time(pcb, &idle))
1330 if (idle_time_hook != 0) {
1331 tlim = idle_time_hook(&idle);
1334 itime = LWIP_MIN(idle.xmit_idle, idle.recv_idle);
1335 tlim = pcb->settings.idle_time_limit - itime;
1341 ppp_notice(
"Terminating connection due to lack of activity.");
1342 pcb->err_code = PPPERR_IDLETIMEOUT;
1343 lcp_close(pcb,
"Link inactive");
1348 TIMEOUT(check_idle, (
void*)pcb, tlim);
1357 static void connect_time_expired(
void *arg) {
1358 ppp_pcb *pcb = (ppp_pcb*)arg;
1359 ppp_info(
"Connect time expired");
1360 pcb->err_code = PPPERR_CONNECTTIME;
1361 lcp_close(pcb,
"Connect time expired");
1370 auth_check_options()
1372 lcp_options *wo = &lcp_wantoptions[0];
1377 if (our_name[0] == 0 || usehostname)
1378 strlcpy(our_name, hostname,
sizeof(our_name));
1381 if (ppp_settings.user[0] == 0 && !explicit_user)
1382 strlcpy(ppp_settings.user, our_name,
sizeof(ppp_settings.user));
1388 if (!auth_required && !allow_any_ip && have_route_to(0) && !privileged) {
1395 if (wo->chap_mdtype)
1400 if (auth_required) {
1414 wo->neg_chap = CHAP_MDTYPE_SUPPORTED != MDTYPE_NONE;
1415 wo->chap_mdtype = CHAP_MDTYPE_SUPPORTED;
1427 wo->chap_mdtype = MDTYPE_NONE;
1444 can_auth = wo->neg_upap && (uselogin || have_pap_secret(&lacks_ip));
1457 can_auth = have_chap_secret((explicit_remote? remote_name: NULL),
1458 our_name, 1, &lacks_ip);
1468 can_auth = have_srp_secret((explicit_remote? remote_name: NULL),
1469 our_name, 1, &lacks_ip);
1472 if (auth_required && !can_auth && noauth_addrs == NULL) {
1475 "By default the remote system is required to authenticate itself");
1477 "(because this system has a default route to the internet)");
1478 }
else if (explicit_remote)
1480 "The remote system (%s) is required to authenticate itself",
1484 "The remote system is required to authenticate itself");
1486 "but I couldn't find any suitable secret (password) for it to use to do so.");
1489 "(None of the available passwords would let it use an IP address.)");
1497 if (!auth_number()) {
1498 ppp_warn(
"calling number %q is not authorized", remote_number);
1499 exit(EXIT_CNID_AUTH_FAILED);
1514 lcp_options *go = &lcp_gotoptions[unit];
1515 lcp_options *ao = &lcp_allowoptions[unit];
1519 ao->neg_upap = !refuse_pap && (passwd[0] != 0 || get_pap_passwd(NULL));
1520 ao->neg_chap = (!refuse_chap || !refuse_mschap || !refuse_mschap_v2)
1521 && (passwd[0] != 0 ||
1522 (hadchap = have_chap_secret(user, (explicit_remote? remote_name:
1524 ao->neg_eap = !refuse_eap && (
1526 (hadchap == 1 || (hadchap == -1 && have_chap_secret(user,
1527 (explicit_remote? remote_name: NULL), 0, NULL))) ||
1528 have_srp_secret(user, (explicit_remote? remote_name: NULL), 0, NULL));
1531 if (go->neg_upap && !uselogin && !have_pap_secret(NULL))
1534 if (!(hadchap = have_chap_secret((explicit_remote? remote_name: NULL),
1535 our_name, 1, NULL)))
1539 (hadchap == 0 || (hadchap == -1 &&
1540 !have_chap_secret((explicit_remote? remote_name: NULL), our_name,
1542 !have_srp_secret((explicit_remote? remote_name: NULL), our_name, 1,
1558 check_passwd(unit, auser, userlen, apasswd, passwdlen, msg)
1566 return UPAP_AUTHNAK;
1570 struct wordlist *addrs = NULL, *opts = NULL;
1571 char passwd[256], user[256];
1572 char secret[MAXWORDLEN];
1573 static int attempts = 0;
1580 slprintf(ppp_settings.passwd,
sizeof(ppp_settings.passwd),
"%.*v", passwdlen, apasswd);
1581 slprintf(ppp_settings.user,
sizeof(ppp_settings.user),
"%.*v", userlen, auser);
1587 if (pap_auth_hook) {
1588 ret = (*pap_auth_hook)(ppp_settings.user, ppp_settings.passwd, msg, &addrs, &opts);
1593 set_allowed_addrs(unit, addrs, opts);
1595 free_wordlist(opts);
1597 free_wordlist(addrs);
1598 BZERO(ppp_settings.passwd,
sizeof(ppp_settings.passwd));
1599 return ret? UPAP_AUTHACK: UPAP_AUTHNAK;
1607 filename = _PATH_UPAPFILE;
1608 addrs = opts = NULL;
1610 f = fopen(filename,
"r");
1612 ppp_error(
"Can't open PAP password file %s: %m", filename);
1615 check_access(f, filename);
1616 if (scan_authfile(f, ppp_settings.user, our_name, secret, &addrs, &opts, filename, 0) < 0) {
1617 ppp_warn(
"no PAP secret found for %s", user);
1623 int login_secret = strcmp(secret,
"@login") == 0;
1625 if (uselogin || login_secret) {
1627 if (session_full(ppp_settings.user, ppp_settings.passwd, devnam, msg) == 0) {
1630 }
else if (session_mgmt) {
1631 if (session_check(ppp_settings.user, NULL, devnam, NULL) == 0) {
1632 ppp_warn(
"Peer %q failed PAP Session verification", user);
1636 if (secret[0] != 0 && !login_secret) {
1638 if ((cryptpap || strcmp(ppp_settings.passwd, secret) != 0)
1639 && strcmp(crypt(ppp_settings.passwd, secret), secret) != 0)
1646 if (ret == UPAP_AUTHNAK) {
1648 *msg =
"Login incorrect";
1655 if (attempts++ >= 10) {
1656 ppp_warn(
"%d LOGIN FAILURES ON %s, %s", attempts, devnam, user);
1657 lcp_close(pcb,
"login failed");
1660 sleep((u_int) (attempts - 3) * 5);
1662 free_wordlist(opts);
1668 set_allowed_addrs(unit, addrs, opts);
1672 free_wordlist(addrs);
1673 BZERO(ppp_settings.passwd,
sizeof(ppp_settings.passwd));
1674 BZERO(secret,
sizeof(secret));
1691 struct wordlist *addrs, *opts;
1692 char secret[MAXWORDLEN];
1699 ret = (*null_auth_hook)(&addrs, &opts);
1705 filename = _PATH_UPAPFILE;
1707 f = fopen(filename,
"r");
1710 check_access(f, filename);
1712 i = scan_authfile(f,
"", our_name, secret, &addrs, &opts, filename, 0);
1713 ret = i >= 0 && secret[0] == 0;
1714 BZERO(secret,
sizeof(secret));
1719 set_allowed_addrs(unit, addrs, opts);
1721 free_wordlist(opts);
1723 free_wordlist(addrs);
1735 get_pap_passwd(passwd)
1741 char secret[MAXWORDLEN];
1746 if (pap_passwd_hook) {
1747 ret = (*pap_passwd_hook)(ppp_settings,user, ppp_settings.passwd);
1752 filename = _PATH_UPAPFILE;
1753 f = fopen(filename,
"r");
1756 check_access(f, filename);
1757 ret = scan_authfile(f, user,
1758 (remote_name[0]? remote_name: NULL),
1759 secret, NULL, NULL, filename, 0);
1764 strlcpy(passwd, secret, MAXSECRETLEN);
1765 BZERO(secret,
sizeof(secret));
1774 have_pap_secret(lacks_ipp)
1780 struct wordlist *addrs;
1783 if (pap_check_hook) {
1784 ret = (*pap_check_hook)();
1789 filename = _PATH_UPAPFILE;
1790 f = fopen(filename,
"r");
1794 ret = scan_authfile(f, (explicit_remote? remote_name: NULL), our_name,
1795 NULL, &addrs, NULL, filename, 0);
1797 if (ret >= 0 && !some_ip_ok(addrs)) {
1803 free_wordlist(addrs);
1815 have_chap_secret(client, server, need_ip, lacks_ipp)
1824 struct wordlist *addrs;
1826 if (chap_check_hook) {
1827 ret = (*chap_check_hook)();
1833 filename = _PATH_CHAPFILE;
1834 f = fopen(filename,
"r");
1838 if (client != NULL && client[0] == 0)
1840 else if (server != NULL && server[0] == 0)
1843 ret = scan_authfile(f, client, server, NULL, &addrs, NULL, filename, 0);
1845 if (ret >= 0 && need_ip && !some_ip_ok(addrs)) {
1851 free_wordlist(addrs);
1863 have_srp_secret(client, server, need_ip, lacks_ipp)
1872 struct wordlist *addrs;
1874 filename = _PATH_SRPFILE;
1875 f = fopen(filename,
"r");
1879 if (client != NULL && client[0] == 0)
1881 else if (server != NULL && server[0] == 0)
1884 ret = scan_authfile(f, client, server, NULL, &addrs, NULL, filename, 0);
1886 if (ret >= 0 && need_ip && !some_ip_ok(addrs)) {
1892 free_wordlist(addrs);
1898 #if PPP_AUTH_SUPPORT 1904 int get_secret(ppp_pcb *pcb,
const char *client,
const char *server,
char *secret,
int *secret_len,
int am_server) {
1909 if (!client || !client[0] || !pcb->settings.user || !pcb->settings.passwd || strcmp(client, pcb->settings.user)) {
1913 len = (int)strlen(pcb->settings.passwd);
1914 if (len > MAXSECRETLEN) {
1915 ppp_error(
"Secret for %s on %s is too long", client, server);
1919 MEMCPY(secret, pcb->settings.passwd, len);
1927 struct wordlist *addrs, *opts;
1928 char secbuf[MAXWORDLEN];
1929 struct wordlist *addrs;
1932 if (!am_server && ppp_settings.passwd[0] != 0) {
1933 strlcpy(secbuf, ppp_settings.passwd,
sizeof(secbuf));
1934 }
else if (!am_server && chap_passwd_hook) {
1935 if ( (*chap_passwd_hook)(client, secbuf) < 0) {
1936 ppp_error(
"Unable to obtain CHAP password for %s on %s from plugin",
1941 filename = _PATH_CHAPFILE;
1945 f = fopen(filename,
"r");
1947 ppp_error(
"Can't open chap secret file %s: %m", filename);
1950 check_access(f, filename);
1952 ret = scan_authfile(f, client, server, secbuf, &addrs, &opts, filename, 0);
1958 set_allowed_addrs(unit, addrs, opts);
1960 free_wordlist(opts);
1962 free_wordlist(addrs);
1965 len = strlen(secbuf);
1966 if (len > MAXSECRETLEN) {
1967 ppp_error(
"Secret for %s on %s is too long", client, server);
1970 MEMCPY(secret, secbuf, len);
1971 BZERO(secbuf,
sizeof(secbuf));
1987 get_srp_secret(unit, client, server, secret, am_server)
1997 struct wordlist *addrs, *opts;
1999 if (!am_server && ppp_settings.passwd[0] !=
'\0') {
2000 strlcpy(secret, ppp_settings.passwd, MAXWORDLEN);
2002 filename = _PATH_SRPFILE;
2005 fp = fopen(filename,
"r");
2007 ppp_error(
"Can't open srp secret file %s: %m", filename);
2010 check_access(fp, filename);
2013 ret = scan_authfile(fp, client, server, secret, &addrs, &opts,
2014 filename, am_server);
2020 set_allowed_addrs(unit, addrs, opts);
2021 else if (opts != NULL)
2022 free_wordlist(opts);
2024 free_wordlist(addrs);
2036 set_allowed_addrs(unit, addrs, opts)
2038 struct wordlist *addrs;
2039 struct wordlist *opts;
2042 struct wordlist *ap, **plink;
2043 struct permitted_ip *ip;
2044 char *ptr_word, *ptr_mask;
2047 u32_t a, mask, ah, offset;
2048 struct ipcp_options *wo = &ipcp_wantoptions[unit];
2049 u32_t suggested_ip = 0;
2051 if (addresses[unit] != NULL)
2052 free(addresses[unit]);
2053 addresses[unit] = NULL;
2054 if (extra_options != NULL)
2055 free_wordlist(extra_options);
2056 extra_options = opts;
2061 n = wordlist_count(addrs) + wordlist_count(noauth_addrs);
2064 ip = (
struct permitted_ip *) malloc((n + 1) *
sizeof(
struct permitted_ip));
2069 for (plink = &addrs; *plink != NULL; plink = &(*plink)->next)
2071 *plink = noauth_addrs;
2074 for (ap = addrs; ap != NULL; ap = ap->next) {
2076 ptr_word = ap->word;
2077 if (strcmp(ptr_word,
"-") == 0)
2079 if (strcmp(ptr_word,
"*") == 0) {
2081 ip[n].base = ip[n].mask = 0;
2087 if (*ptr_word ==
'!') {
2094 ptr_mask = strchr (ptr_word,
'/');
2095 if (ptr_mask != NULL) {
2099 bit_count = (int) strtol (ptr_mask+1, &endp, 10);
2100 if (bit_count <= 0 || bit_count > 32) {
2101 ppp_warn(
"invalid address length %v in auth. address list",
2105 bit_count = 32 - bit_count;
2107 offset = ifunit + 1;
2111 ppp_warn(
"invalid address length syntax: %v", ptr_mask+1);
2118 hp = gethostbyname(ptr_word);
2119 if (hp != NULL && hp->h_addrtype == AF_INET) {
2120 a = *(u32_t *)hp->h_addr;
2122 np = getnetbyname (ptr_word);
2123 if (np != NULL && np->n_addrtype == AF_INET) {
2124 a = lwip_htonl ((u32_t)np->n_net);
2125 if (ptr_mask == NULL) {
2129 mask = IN_CLASSA_NET;
2130 else if (IN_CLASSB(ah))
2131 mask = IN_CLASSB_NET;
2132 else if (IN_CLASSC(ah))
2133 mask = IN_CLASSC_NET;
2136 a = inet_addr (ptr_word);
2140 if (ptr_mask != NULL)
2143 if (a == (u32_t)-1L) {
2144 ppp_warn(
"unknown host %s in auth. address list", ap->word);
2148 if (offset >= ~mask) {
2149 ppp_warn(
"interface unit %d too large for subnet %v",
2153 a = lwip_htonl((lwip_ntohl(a) & mask) + offset);
2156 ip[n].mask = lwip_htonl(mask);
2157 ip[n].base = a & ip[n].mask;
2159 if (~mask == 0 && suggested_ip == 0)
2168 addresses[unit] = ip;
2175 if (suggested_ip != 0
2176 && (wo->hisaddr == 0 || !auth_ip_addr(unit, wo->hisaddr))) {
2177 wo->hisaddr = suggested_ip;
2183 wo->accept_remote = 1;
2192 auth_ip_addr(unit, addr)
2199 if (bad_ip_adrs(addr))
2202 if (allowed_address_hook) {
2203 ok = allowed_address_hook(addr);
2204 if (ok >= 0)
return ok;
2207 if (addresses[unit] != NULL) {
2208 ok = ip_addr_check(addr, addresses[unit]);
2215 return allow_any_ip || privileged || !have_route_to(addr);
2219 ip_addr_check(addr, addrs)
2221 struct permitted_ip *addrs;
2224 if ((addr & addrs->mask) == addrs->base)
2225 return addrs->permit;
2237 addr = lwip_ntohl(addr);
2238 return (addr >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET
2239 || IN_MULTICAST(addr) || IN_BADCLASS(addr);
2248 struct wordlist *addrs;
2250 for (; addrs != 0; addrs = addrs->next) {
2251 if (addrs->word[0] ==
'-')
2253 if (addrs->word[0] !=
'!')
2266 struct wordlist *wp = permitted_numbers;
2276 l = strlen(wp->word);
2277 if ((wp->word)[l - 1] ==
'*')
2279 if (!strncasecmp(wp->word, remote_number, l))
2291 check_access(f, filename)
2297 if (fstat(fileno(f), &sbuf) < 0) {
2298 ppp_warn(
"cannot stat secret file %s: %m", filename);
2299 }
else if ((sbuf.st_mode & (S_IRWXG | S_IRWXO)) != 0) {
2300 ppp_warn(
"Warning - secret file %s has world and/or group access",
2320 scan_authfile(f, client, server, secret, addrs, opts, filename, flags)
2325 struct wordlist **addrs;
2326 struct wordlist **opts;
2331 int got_flag, best_flag;
2333 struct wordlist *ap, *addr_list, *alist, **app;
2334 char word[MAXWORDLEN];
2335 char atfile[MAXWORDLEN];
2336 char lsecret[MAXWORDLEN];
2344 if (!getword(f, word, &newline, filename))
2352 while (!newline && getword(f, word, &newline, filename))
2361 if (client != NULL && strcmp(word, client) != 0 && !ISWILD(word)) {
2366 got_flag = NONWILD_CLIENT;
2371 if (!getword(f, word, &newline, filename))
2375 if (!ISWILD(word)) {
2376 if (server != NULL && strcmp(word, server) != 0)
2378 got_flag |= NONWILD_SERVER;
2385 if (got_flag <= best_flag)
2391 if (!getword(f, word, &newline, filename))
2400 if (flags && ((cp = strchr(word,
':')) == NULL ||
2401 strchr(cp + 1,
':') == NULL))
2404 if (secret != NULL) {
2408 if (word[0] ==
'@' && word[1] ==
'/') {
2409 strlcpy(atfile, word+1,
sizeof(atfile));
2410 if ((sf = fopen(atfile,
"r")) == NULL) {
2411 ppp_warn(
"can't open indirect secret file %s", atfile);
2414 check_access(sf, atfile);
2415 if (!getword(sf, word, &xxx, atfile)) {
2416 ppp_warn(
"no secret in indirect secret file %s", atfile);
2422 strlcpy(lsecret, word,
sizeof(lsecret));
2430 if (!getword(f, word, &newline, filename) || newline)
2432 ap = (
struct wordlist *)
2433 malloc(
sizeof(
struct wordlist) + strlen(word) + 1);
2435 novm(
"authorized addresses");
2436 ap->word = (
char *) (ap + 1);
2437 strcpy(ap->word, word);
2446 best_flag = got_flag;
2448 free_wordlist(addr_list);
2451 strlcpy(secret, lsecret, MAXWORDLEN);
2458 for (app = &addr_list; (ap = *app) != NULL; app = &ap->next)
2459 if (strcmp(ap->word,
"--") == 0)
2469 else if (ap != NULL)
2473 else if (addr_list != NULL)
2474 free_wordlist(addr_list);
2484 struct wordlist *wp;
2488 for (n = 0; wp != NULL; wp = wp->next)
2498 struct wordlist *wp;
2500 struct wordlist *next;
2502 while (wp != NULL) {
#define LWIP_UNUSED_ARG(x)