]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/auth.c
Update README to fix an error
[ppp.git] / pppd / auth.c
index ecd30badc73978987c4be63be10233346f663c5c..aabab17715fec756ff7cb6d51ec32b3178fffdb9 100644 (file)
@@ -83,6 +83,7 @@
 #include <grp.h>
 #include <string.h>
 #include <strings.h>
+#include <sys/param.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/socket.h>
@@ -253,6 +254,8 @@ 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 */
+char path_upapfile[MAXPATHLEN];        /* Pathname of pap-secrets file */
+char path_chapfile[MAXPATHLEN];        /* Pathname of chap-secrets file */
 
 #if defined(PPP_WITH_EAPTLS) || defined(PPP_WITH_PEAP)
 char *cacert_file  = NULL;  /* CA certificate file (pem format) */
@@ -417,6 +420,14 @@ struct option auth_options[] = {
       "Set remote name for authentication", OPT_PRIO | OPT_STATIC,
       &explicit_remote, MAXNAMELEN },
 
+    { "pap-secrets", o_string, path_upapfile,
+      "Set pathname of pap-secrets", OPT_PRIO | OPT_PRIV | OPT_STATIC,
+      NULL, MAXPATHLEN },
+
+    { "chap-secrets", o_string, path_chapfile,
+      "Set pathname of chap-secrets", OPT_PRIO | OPT_PRIV | OPT_STATIC,
+      NULL, MAXPATHLEN },
+
     { "login", o_bool, &uselogin,
       "Use system password database for PAP", OPT_A2COPY | 1 ,
       &session_mgmt },
@@ -1031,10 +1042,12 @@ auth_peer_success(int unit, int protocol, int prot_flavor,
                  char *name, int namelen)
 {
     int bit;
+    const char *prot;
 
     switch (protocol) {
     case PPP_CHAP:
        bit = CHAP_PEER;
+       prot = "CHAP";
        switch (prot_flavor) {
        case CHAP_MD5:
            bit |= CHAP_MD5_PEER;
@@ -1051,12 +1064,15 @@ auth_peer_success(int unit, int protocol, int prot_flavor,
        break;
     case PPP_PAP:
        bit = PAP_PEER;
+       prot = "PAP";
        break;
     case PPP_EAP:
        bit = EAP_PEER;
+       prot = "EAP";
        break;
     default:
        warn("auth_peer_success: unknown protocol %x", protocol);
+       prot = "unknown protocol";
        return;
     }
 
@@ -1068,6 +1084,7 @@ auth_peer_success(int unit, int protocol, int prot_flavor,
     BCOPY(name, peer_authname, namelen);
     peer_authname[namelen] = 0;
     ppp_script_setenv("PEERNAME", peer_authname, 0);
+    notice("Peer %q authenticated with %s", peer_authname, prot);
 
     /* Save the authentication method for later. */
     auth_done[unit] |= bit;
@@ -1532,7 +1549,7 @@ check_passwd(int unit,
      * Open the file of pap secrets and scan for a suitable secret
      * for authenticating this user.
      */
-    filename = PPP_PATH_UPAPFILE;
+    filename = path_upapfile;
     addrs = opts = NULL;
     ret = UPAP_AUTHNAK;
     f = fopen(filename, "r");
@@ -1633,7 +1650,7 @@ null_login(int unit)
      * Open the file of pap secrets and scan for a suitable secret.
      */
     if (ret <= 0) {
-       filename = PPP_PATH_UPAPFILE;
+       filename = path_upapfile;
        addrs = NULL;
        f = fopen(filename, "r");
        if (f == NULL)
@@ -1680,7 +1697,7 @@ get_pap_passwd(char *passwd)
            return ret;
     }
 
-    filename = PPP_PATH_UPAPFILE;
+    filename = path_upapfile;
     f = fopen(filename, "r");
     if (f == NULL)
        return 0;
@@ -1717,7 +1734,7 @@ have_pap_secret(int *lacks_ipp)
            return ret;
     }
 
-    filename = PPP_PATH_UPAPFILE;
+    filename = path_upapfile;
     f = fopen(filename, "r");
     if (f == NULL)
        return 0;
@@ -1759,7 +1776,7 @@ have_chap_secret(char *client, char *server,
        }
     }
 
-    filename = PPP_PATH_CHAPFILE;
+    filename = path_chapfile;
     f = fopen(filename, "r");
     if (f == NULL)
        return 0;
@@ -1845,7 +1862,7 @@ get_secret(int unit, char *client, char *server,
            return 0;
        }
     } else {
-       filename = PPP_PATH_CHAPFILE;
+       filename = path_chapfile;
        addrs = NULL;
        secbuf[0] = 0;
 
@@ -2154,7 +2171,7 @@ int
 auth_number(void)
 {
     struct wordlist *wp = permitted_numbers;
-    int l;
+    size_t l;
 
     /* Allow all if no authorization list. */
     if (!wp)
@@ -2164,9 +2181,10 @@ auth_number(void)
     while (wp) {
        /* trailing '*' wildcard */
        l = strlen(wp->word);
-       if ((wp->word)[l - 1] == '*')
-           l--;
-       if (!strncasecmp(wp->word, remote_number, l))
+       if (l > 0 && (wp->word)[l - 1] == '*') {
+           if (!strncasecmp(wp->word, remote_number, l - 1))
+               return 1;
+       } else if (strcasecmp(wp->word, remote_number) == 0)
            return 1;
        wp = wp->next;
     }