X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fauth.c;h=fb719446f7489895f0b51081c99b99c8221fd210;hb=f5dda0cfc220c4b52e26144096d729e27b30f0f7;hp=8189787b198f26c13b90d8b5dd2c3d207edc5777;hpb=e5b9a1061f126b36c558aea09fd76fd691ebf018;p=ppp.git diff --git a/pppd/auth.c b/pppd/auth.c index 8189787..fb71944 100644 --- a/pppd/auth.c +++ b/pppd/auth.c @@ -68,7 +68,7 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#define RCSID "$Id: auth.c,v 1.113 2007/06/19 02:08:35 carlsonj Exp $" +#define RCSID "$Id: auth.c,v 1.117 2008/07/01 12:27:56 paulus Exp $" #include #include @@ -190,6 +190,11 @@ int (*null_auth_hook) __P((struct wordlist **paddrs, int (*allowed_address_hook) __P((u_int32_t addr)) = NULL; +#ifdef HAVE_MULTILINK +/* Hook for plugin to hear when an interface joins a multilink bundle */ +void (*multilink_join_hook) __P((void)) = NULL; +#endif + /* A notifier for when the peer has authenticated itself, and we are proceeding to the network phase. */ struct notifier *auth_up_notifier = NULL; @@ -230,6 +235,8 @@ bool usehostname = 0; /* Use hostname for our_name */ bool auth_required = 0; /* Always require authentication from peer */ bool allow_any_ip = 0; /* Allow peer to use any IP address */ bool explicit_remote = 0; /* User specified explicit remote name */ +bool explicit_user = 0; /* Set if "user" option supplied */ +bool explicit_passwd = 0; /* Set if "password" option supplied */ char remote_name[MAXNAMELEN]; /* Peer's name for authentication */ static char *uafname; /* name of most recent +ua file */ @@ -355,11 +362,13 @@ option_t auth_options[] = { OPT_PRIO | OPT_A2STRVAL, &uafname }, { "user", o_string, user, - "Set name for auth with peer", OPT_PRIO | OPT_STATIC, NULL, MAXNAMELEN }, + "Set name for auth with peer", OPT_PRIO | OPT_STATIC, + &explicit_user, MAXNAMELEN }, { "password", o_string, passwd, "Password for authenticating us to the peer", - OPT_PRIO | OPT_STATIC | OPT_HIDE, NULL, MAXSECRETLEN }, + OPT_PRIO | OPT_STATIC | OPT_HIDE, + &explicit_passwd, MAXSECRETLEN }, { "usehostname", o_bool, &usehostname, "Must use hostname for authentication", 1 }, @@ -446,10 +455,14 @@ setupapfile(argv) if (l > 0 && p[l-1] == '\n') p[l-1] = 0; - if (override_value("user", option_priority, fname)) + if (override_value("user", option_priority, fname)) { strlcpy(user, u, sizeof(user)); - if (override_value("passwd", option_priority, fname)) + explicit_user = 1; + } + if (override_value("passwd", option_priority, fname)) { strlcpy(passwd, p, sizeof(passwd)); + explicit_passwd = 1; + } return (1); } @@ -544,6 +557,7 @@ void start_link(unit) new_phase(PHASE_SERIALCONN); + hungup = 0; devfd = the_channel->connect(); msg = "Connect script failed"; if (devfd < 0) @@ -770,7 +784,9 @@ link_established(unit) chap_auth_with_peer(unit, user, CHAP_DIGEST(ho->chap_mdtype)); auth |= CHAP_WITHPEER; } else if (ho->neg_upap) { - if (passwd[0] == 0) { + /* If a blank password was explicitly given as an option, trust + the user and don't try to look up one. */ + if (passwd[0] == 0 && !explicit_passwd) { passwd_from_file = 1; if (!get_pap_passwd(passwd)) error("No secret found for PAP login"); @@ -845,6 +861,8 @@ start_networks(unit) #ifdef HAVE_MULTILINK if (multilink) { if (mp_join_bundle()) { + if (multilink_join_hook) + (*multilink_join_hook)(); if (updetach && !nodetach) detach(); return; @@ -1123,7 +1141,6 @@ static void check_maxoctets(arg) void *arg; { - int diff; unsigned int used; update_link_stats(ifunit); @@ -1144,8 +1161,7 @@ check_maxoctets(arg) used = link_stats.bytes_in+link_stats.bytes_out; break; } - diff = maxoctets - used; - if(diff < 0) { + if (used > maxoctets) { notice("Traffic limit reached. Limit: %u Used: %u", maxoctets, used); status = EXIT_TRAFFIC_LIMIT; lcp_close(0, "Traffic limit"); @@ -1212,7 +1228,9 @@ auth_check_options() /* Default our_name to hostname, and user to our_name */ if (our_name[0] == 0 || usehostname) strlcpy(our_name, hostname, sizeof(our_name)); - if (user[0] == 0) + /* If a blank username was explicitly given as an option, trust + the user and don't use our_name */ + if (user[0] == 0 && !explicit_user) strlcpy(user, our_name, sizeof(user)); /*