Log calling number failed authorization at warn instead of error, to be
[ppp.git] / pppd / chap.c
index 85c860fc6816f1c85fd95cec806fb0bed2cdcc54..a63dde818fa01e0db3fcb14b062541d6180044e1 100644 (file)
@@ -33,7 +33,7 @@
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
-#define RCSID  "$Id: chap.c,v 1.34 2002/10/11 22:11:13 fcusack Exp $"
+#define RCSID  "$Id: chap.c,v 1.36 2002/10/12 02:30:21 fcusack Exp $"
 
 /*
  * TODO:
 
 /*
  * TODO:
@@ -457,10 +457,8 @@ ChapReceiveChallenge(cstate, inp, id, len)
     rchallenge = inp;
     INCPTR(rchallenge_len, inp);
 
     rchallenge = inp;
     INCPTR(rchallenge_len, inp);
 
-    if (len >= sizeof(rhostname))
-       len = sizeof(rhostname) - 1;
-    BCOPY(inp, rhostname, len);
-    rhostname[len] = '\000';
+    /* Null terminate and clean remote name. */
+    slprintf(rhostname, sizeof(rhostname), "%.*v", len, inp);
 
     /* Microsoft doesn't send their name back in the PPP packet */
     if (explicit_remote || (remote_name[0] != 0 && rhostname[0] == 0)) {
 
     /* Microsoft doesn't send their name back in the PPP packet */
     if (explicit_remote || (remote_name[0] != 0 && rhostname[0] == 0)) {
@@ -599,6 +597,19 @@ ChapReceiveResponse(cstate, inp, id, len)
        code = (*chap_auth_hook) ( (explicit_remote ? remote_name : rhostname),
                                   remmd, (int) remmd_len,
                                   cstate );
        code = (*chap_auth_hook) ( (explicit_remote ? remote_name : rhostname),
                                   remmd, (int) remmd_len,
                                   cstate );
+       /*
+        * Check remote number authorization.  A plugin may have filled in
+        * the remote number or added an allowed number, and rather than
+        * return an authenticate failure, is leaving it for us to verify.
+        */
+       if (code == CHAP_SUCCESS) {
+           if (!auth_number()) {
+               /* We do not want to leak info about the chap result. */
+               code = CHAP_FAILURE; /* XXX exit value will be "wrong" */
+               warn("calling number %q is not authorized", remote_number);
+           }
+       }
+
     } else {
        if (!get_secret(cstate->unit, (explicit_remote? remote_name: rhostname),
                        cstate->chal_name, secret, &secret_len, 1)) {
     } else {
        if (!get_secret(cstate->unit, (explicit_remote? remote_name: rhostname),
                        cstate->chal_name, secret, &secret_len, 1)) {
@@ -700,7 +711,7 @@ ChapReceiveResponse(cstate, inp, id, len)
        notice("CHAP peer authentication succeeded for %q", rhostname);
 
     } else {
        notice("CHAP peer authentication succeeded for %q", rhostname);
 
     } else {
-       error("CHAP peer authentication failed for %q", rhostname);
+       warn("CHAP peer authentication failed for %q", rhostname);
        cstate->serverstate = CHAPSS_BADAUTH;
        auth_peer_fail(cstate->unit, PPP_CHAP);
     }
        cstate->serverstate = CHAPSS_BADAUTH;
        auth_peer_fail(cstate->unit, PPP_CHAP);
     }