auth.c
上传用户:yyhongfa
上传日期:2013-01-18
资源大小:267k
文件大小:25k
开发平台:

C/C++

  1. /*****************************************************************************
  2. * auth.c - Network Authentication and Phase Control program file.
  3. *
  4. * Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
  5. * Copyright (c) 1997 by Global Election Systems Inc.  All rights reserved.
  6. *
  7. * The authors hereby grant permission to use, copy, modify, distribute,
  8. * and license this software and its documentation for any purpose, provided
  9. * that existing copyright notices are retained in all copies and that this
  10. * notice and the following disclaimer are included verbatim in any 
  11. * distributions. No written agreement, license, or royalty fee is required
  12. * for any of the authorized uses.
  13. *
  14. * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
  15. * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  16. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
  17. * IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  18. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  19. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  20. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  21. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  22. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  23. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  24. *
  25. ******************************************************************************
  26. * REVISION HISTORY
  27. *
  28. * 03-01-01 Marc Boucher <marc@mbsi.ca>
  29. *   Ported to lwIP.
  30. * 97-12-08 Guy Lancaster <lancasterg@acm.org>, Global Election Systems Inc.
  31. *   Ported from public pppd code.
  32. *****************************************************************************/
  33. /*
  34.  * auth.c - PPP authentication and phase control.
  35.  *
  36.  * Copyright (c) 1993 The Australian National University.
  37.  * All rights reserved.
  38.  *
  39.  * Redistribution and use in source and binary forms are permitted
  40.  * provided that the above copyright notice and this paragraph are
  41.  * duplicated in all such forms and that any documentation,
  42.  * advertising materials, and other materials related to such
  43.  * distribution and use acknowledge that the software was developed
  44.  * by the Australian National University.  The name of the University
  45.  * may not be used to endorse or promote products derived from this
  46.  * software without specific prior written permission.
  47.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  48.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  49.  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  50.  *
  51.  * Copyright (c) 1989 Carnegie Mellon University.
  52.  * All rights reserved.
  53.  *
  54.  * Redistribution and use in source and binary forms are permitted
  55.  * provided that the above copyright notice and this paragraph are
  56.  * duplicated in all such forms and that any documentation,
  57.  * advertising materials, and other materials related to such
  58.  * distribution and use acknowledge that the software was developed
  59.  * by Carnegie Mellon University.  The name of the
  60.  * University may not be used to endorse or promote products derived
  61.  * from this software without specific prior written permission.
  62.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  63.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  64.  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  65.  */
  66. #include "ppp.h"
  67. #if PPP_SUPPORT > 0
  68. #include "fsm.h"
  69. #include "lcp.h"
  70. #include "pap.h"
  71. #include "chap.h"
  72. #include "auth.h"
  73. #include "ipcp.h"
  74. #if CBCP_SUPPORT > 0
  75. #include "cbcp.h"
  76. #endif
  77. #include "pppdebug.h"
  78. #include "timer.h"
  79. /*************************/
  80. /*** LOCAL DEFINITIONS ***/
  81. /*************************/
  82. /* Bits in auth_pending[] */
  83. #define PAP_WITHPEER    1
  84. #define PAP_PEER    2
  85. #define CHAP_WITHPEER   4
  86. #define CHAP_PEER   8
  87.                                                                     
  88. /************************/
  89. /*** LOCAL DATA TYPES ***/
  90. /************************/
  91. /* Used for storing a sequence of words.  Usually malloced. */
  92. struct wordlist {
  93.     struct wordlist *next;
  94.     char        word[1];
  95. };
  96. /***********************************/
  97. /*** LOCAL FUNCTION DECLARATIONS ***/
  98. /***********************************/
  99. extern char *crypt (const char *, const char *);
  100. /* Prototypes for procedures local to this file. */
  101. static void network_phase (int);
  102. static void check_idle (void *);
  103. static void connect_time_expired (void *);
  104. #if 0
  105. static int  login (char *, char *, char **, int *);
  106. #endif
  107. static void logout (void);
  108. static int  null_login (int);
  109. static int  get_pap_passwd (int, char *, char *);
  110. static int  have_pap_secret (void);
  111. static int  have_chap_secret (char *, char *, u32_t);
  112. static int  ip_addr_check (u32_t, struct wordlist *);
  113. #if 0 /* PAP_SUPPORT > 0 || CHAP_SUPPORT > 0 */
  114. static void set_allowed_addrs(int unit, struct wordlist *addrs);
  115. static void free_wordlist (struct wordlist *);
  116. #endif
  117. #if CBCP_SUPPORT > 0
  118. static void callback_phase (int);
  119. #endif
  120. /******************************/
  121. /*** PUBLIC DATA STRUCTURES ***/
  122. /******************************/
  123. /*****************************/
  124. /*** LOCAL DATA STRUCTURES ***/
  125. /*****************************/
  126. #if PAP_SUPPORT > 0 || CHAP_SUPPORT > 0
  127. /* The name by which the peer authenticated itself to us. */
  128. static char peer_authname[MAXNAMELEN];
  129. #endif
  130. /* Records which authentication operations haven't completed yet. */
  131. static int auth_pending[NUM_PPP];
  132. /* Set if we have successfully called login() */
  133. static int logged_in;
  134. /* Set if we have run the /etc/ppp/auth-up script. */
  135. static int did_authup;
  136. /* List of addresses which the peer may use. */
  137. static struct wordlist *addresses[NUM_PPP];
  138. /* Number of network protocols which we have opened. */
  139. static int num_np_open;
  140. /* Number of network protocols which have come up. */
  141. static int num_np_up;
  142. #if PAP_SUPPORT > 0 || CHAP_SUPPORT > 0
  143. /* Set if we got the contents of passwd[] from the pap-secrets file. */
  144. static int passwd_from_file;
  145. #endif
  146. /***********************************/
  147. /*** PUBLIC FUNCTION DEFINITIONS ***/
  148. /***********************************/
  149. /*
  150.  * An Open on LCP has requested a change from Dead to Establish phase.
  151.  * Do what's necessary to bring the physical layer up.
  152.  */
  153. void link_required(int unit)
  154. {
  155.     AUTHDEBUG((LOG_INFO, "link_required: %dn", unit));
  156. }
  157. /*
  158.  * LCP has terminated the link; go to the Dead phase and take the
  159.  * physical layer down.
  160.  */
  161. void link_terminated(int unit)
  162. {
  163.     AUTHDEBUG((LOG_INFO, "link_terminated: %dn", unit));
  164.     
  165.     if (lcp_phase[unit] == PHASE_DEAD)
  166.         return;
  167.     if (logged_in)
  168.         logout();
  169.     lcp_phase[unit] = PHASE_DEAD;
  170.     AUTHDEBUG((LOG_NOTICE, "Connection terminated.n"));
  171. pppMainWakeup(unit);
  172. }
  173. /*
  174.  * LCP has gone down; it will either die or try to re-establish.
  175.  */
  176. void link_down(int unit)
  177. {
  178.     int i;
  179.     struct protent *protp;
  180.     
  181.     AUTHDEBUG((LOG_INFO, "link_down: %dn", unit));
  182.     if (did_authup) {
  183.         /* XXX Do link down processing. */
  184.         did_authup = 0;
  185.     }
  186.     for (i = 0; (protp = ppp_protocols[i]) != NULL; ++i) {
  187.         if (!protp->enabled_flag)
  188.             continue;
  189.         if (protp->protocol != PPP_LCP && protp->lowerdown != NULL)
  190.             (*protp->lowerdown)(unit);
  191.         if (protp->protocol < 0xC000 && protp->close != NULL)
  192.             (*protp->close)(unit, "LCP down");
  193.     }
  194.     num_np_open = 0;
  195.     num_np_up = 0;
  196.     if (lcp_phase[unit] != PHASE_DEAD)
  197.         lcp_phase[unit] = PHASE_TERMINATE;
  198. pppMainWakeup(unit);
  199. }
  200. /*
  201.  * The link is established.
  202.  * Proceed to the Dead, Authenticate or Network phase as appropriate.
  203.  */
  204. void link_established(int unit)
  205. {
  206.     int auth;
  207.     int i;
  208.     struct protent *protp;
  209.     lcp_options *wo = &lcp_wantoptions[unit];
  210.     lcp_options *go = &lcp_gotoptions[unit];
  211. #if PAP_SUPPORT > 0 || CHAP_SUPPORT > 0
  212.     lcp_options *ho = &lcp_hisoptions[unit];
  213. #endif
  214.     
  215.     AUTHDEBUG((LOG_INFO, "link_established: %dn", unit));
  216.     /*
  217.      * Tell higher-level protocols that LCP is up.
  218.      */
  219.     for (i = 0; (protp = ppp_protocols[i]) != NULL; ++i)
  220.         if (protp->protocol != PPP_LCP && protp->enabled_flag
  221.                 && protp->lowerup != NULL)
  222.             (*protp->lowerup)(unit);
  223.     
  224.     if (ppp_settings.auth_required && !(go->neg_chap || go->neg_upap)) {
  225.         /*
  226.          * We wanted the peer to authenticate itself, and it refused:
  227.          * treat it as though it authenticated with PAP using a username
  228.          * of "" and a password of "".  If that's not OK, boot it out.
  229.          */
  230.         if (!wo->neg_upap || !null_login(unit)) {
  231.             AUTHDEBUG((LOG_WARNING, "peer refused to authenticaten"));
  232.             lcp_close(unit, "peer refused to authenticate");
  233.             return;
  234.         }
  235.     }
  236.     
  237.     lcp_phase[unit] = PHASE_AUTHENTICATE;
  238.     auth = 0;
  239. #if CHAP_SUPPORT > 0
  240.     if (go->neg_chap) {
  241.         ChapAuthPeer(unit, ppp_settings.our_name, go->chap_mdtype);
  242.         auth |= CHAP_PEER;
  243.     } 
  244. #endif
  245. #if PAP_SUPPORT > 0 && CHAP_SUPPORT > 0
  246.     else
  247. #endif
  248. #if PAP_SUPPORT > 0
  249.     if (go->neg_upap) {
  250.         upap_authpeer(unit);
  251.         auth |= PAP_PEER;
  252.     }
  253. #endif
  254. #if CHAP_SUPPORT > 0
  255.     if (ho->neg_chap) {
  256.         ChapAuthWithPeer(unit, ppp_settings.user, ho->chap_mdtype);
  257.         auth |= CHAP_WITHPEER;
  258.     }
  259. #endif
  260. #if PAP_SUPPORT > 0 && CHAP_SUPPORT > 0
  261.     else
  262. #endif
  263. #if PAP_SUPPORT > 0
  264.     if (ho->neg_upap) {
  265.         if (ppp_settings.passwd[0] == 0) {
  266.             passwd_from_file = 1;
  267.             if (!get_pap_passwd(unit, ppp_settings.user, ppp_settings.passwd))
  268.                 AUTHDEBUG((LOG_ERR, "No secret found for PAP loginn"));
  269.         }
  270.         upap_authwithpeer(unit, ppp_settings.user, ppp_settings.passwd);
  271.         auth |= PAP_WITHPEER;
  272.     }
  273. #endif
  274.     auth_pending[unit] = auth;
  275.     
  276.     if (!auth)
  277.         network_phase(unit);
  278. }
  279. /*
  280.  * The peer has failed to authenticate himself using `protocol'.
  281.  */
  282. void auth_peer_fail(int unit, u16_t protocol)
  283. {
  284.     AUTHDEBUG((LOG_INFO, "auth_peer_fail: %d proto=%Xn", unit, protocol));
  285.     /*
  286.      * Authentication failure: take the link down
  287.      */
  288.     lcp_close(unit, "Authentication failed");
  289. }
  290. #if PAP_SUPPORT > 0 || CHAP_SUPPORT > 0
  291. /*
  292.  * The peer has been successfully authenticated using `protocol'.
  293.  */
  294. void auth_peer_success(int unit, u16_t protocol, char *name, int namelen)
  295. {
  296.     int pbit;
  297.     
  298.     AUTHDEBUG((LOG_INFO, "auth_peer_success: %d proto=%Xn", unit, protocol));
  299.     switch (protocol) {
  300.     case PPP_CHAP:
  301.         pbit = CHAP_PEER;
  302.         break;
  303.     case PPP_PAP:
  304.         pbit = PAP_PEER;
  305.         break;
  306.     default:
  307.         AUTHDEBUG((LOG_WARNING, "auth_peer_success: unknown protocol %xn",
  308.                protocol));
  309.         return;
  310.     }
  311.     
  312.     /*
  313.      * Save the authenticated name of the peer for later.
  314.      */
  315.     if (namelen > sizeof(peer_authname) - 1)
  316.         namelen = sizeof(peer_authname) - 1;
  317.     BCOPY(name, peer_authname, namelen);
  318.     peer_authname[namelen] = 0;
  319.     
  320.     /*
  321.      * If there is no more authentication still to be done,
  322.      * proceed to the network (or callback) phase.
  323.      */
  324.     if ((auth_pending[unit] &= ~pbit) == 0)
  325.         network_phase(unit);
  326. }
  327. /*
  328.  * We have failed to authenticate ourselves to the peer using `protocol'.
  329.  */
  330. void auth_withpeer_fail(int unit, u16_t protocol)
  331. {
  332.     int errCode = PPPERR_AUTHFAIL;
  333.     
  334.     AUTHDEBUG((LOG_INFO, "auth_withpeer_fail: %d proto=%Xn", unit, protocol));
  335.     if (passwd_from_file)
  336.         BZERO(ppp_settings.passwd, MAXSECRETLEN);
  337.     /* 
  338.      * XXX Warning: the unit number indicates the interface which is
  339.      * not necessarily the PPP connection.  It works here as long
  340.      * as we are only supporting PPP interfaces.
  341.      */
  342.     pppIOCtl(unit, PPPCTLS_ERRCODE, &errCode);
  343.     /*
  344.      * We've failed to authenticate ourselves to our peer.
  345.      * He'll probably take the link down, and there's not much
  346.      * we can do except wait for that.
  347.      */
  348. }
  349. /*
  350.  * We have successfully authenticated ourselves with the peer using `protocol'.
  351.  */
  352. void auth_withpeer_success(int unit, u16_t protocol)
  353. {
  354.     int pbit;
  355.     
  356.     AUTHDEBUG((LOG_INFO, "auth_withpeer_success: %d proto=%Xn", unit, protocol));
  357.     switch (protocol) {
  358.     case PPP_CHAP:
  359.         pbit = CHAP_WITHPEER;
  360.         break;
  361.     case PPP_PAP:
  362.         if (passwd_from_file)
  363.             BZERO(ppp_settings.passwd, MAXSECRETLEN);
  364.         pbit = PAP_WITHPEER;
  365.         break;
  366.     default:
  367.         AUTHDEBUG((LOG_WARNING, "auth_peer_success: unknown protocol %xn",
  368.                protocol));
  369.         pbit = 0;
  370.     }
  371.     
  372.     /*
  373.      * If there is no more authentication still being done,
  374.      * proceed to the network (or callback) phase.
  375.      */
  376.     if ((auth_pending[unit] &= ~pbit) == 0)
  377.         network_phase(unit);
  378. }
  379. #endif
  380. /*
  381.  * np_up - a network protocol has come up.
  382.  */
  383. void np_up(int unit, u16_t proto)
  384. {
  385.     AUTHDEBUG((LOG_INFO, "np_up: %d proto=%Xn", unit, proto));
  386.     if (num_np_up == 0) {
  387. AUTHDEBUG((LOG_INFO, "np_up: maxconnect=%d idle_time_limit=%dn",ppp_settings.maxconnect,ppp_settings.idle_time_limit));
  388.         /*
  389.          * At this point we consider that the link has come up successfully.
  390.          */
  391.         if (ppp_settings.idle_time_limit > 0)
  392.             TIMEOUT(check_idle, NULL, ppp_settings.idle_time_limit);
  393.         
  394.         /*
  395.          * Set a timeout to close the connection once the maximum
  396.          * connect time has expired.
  397.          */
  398.         if (ppp_settings.maxconnect > 0)
  399.             TIMEOUT(connect_time_expired, 0, ppp_settings.maxconnect);
  400.     }
  401.     ++num_np_up;
  402. }
  403. /*
  404.  * np_down - a network protocol has gone down.
  405.  */
  406. void np_down(int unit, u16_t proto)
  407. {
  408.     AUTHDEBUG((LOG_INFO, "np_down: %d proto=%Xn", unit, proto));
  409.     if (--num_np_up == 0 && ppp_settings.idle_time_limit > 0) {
  410.         UNTIMEOUT(check_idle, NULL);
  411.     }
  412. }
  413. /*
  414.  * np_finished - a network protocol has finished using the link.
  415.  */
  416. void np_finished(int unit, u16_t proto)
  417. {
  418.     AUTHDEBUG((LOG_INFO, "np_finished: %d proto=%Xn", unit, proto));
  419.     if (--num_np_open <= 0) {
  420.         /* no further use for the link: shut up shop. */
  421.         lcp_close(0, "No network protocols running");
  422.     }
  423. }
  424. /*
  425.  * auth_reset - called when LCP is starting negotiations to recheck
  426.  * authentication options, i.e. whether we have appropriate secrets
  427.  * to use for authenticating ourselves and/or the peer.
  428.  */
  429. void auth_reset(int unit)
  430. {
  431.     lcp_options *go = &lcp_gotoptions[unit];
  432.     lcp_options *ao = &lcp_allowoptions[0];
  433.     ipcp_options *ipwo = &ipcp_wantoptions[0];
  434.     u32_t remote;
  435.     
  436.     AUTHDEBUG((LOG_INFO, "auth_reset: %dn", unit));
  437.     ao->neg_upap = !ppp_settings.refuse_pap && (ppp_settings.passwd[0] != 0 || get_pap_passwd(unit, NULL, NULL));
  438.     ao->neg_chap = !ppp_settings.refuse_chap && ppp_settings.passwd[0] != 0 /*have_chap_secret(ppp_settings.user, ppp_settings.remote_name, (u32_t)0)*/;
  439.     
  440.     if (go->neg_upap && !have_pap_secret())
  441.         go->neg_upap = 0;
  442.     if (go->neg_chap) {
  443.         remote = ipwo->accept_remote? 0: ipwo->hisaddr;
  444.         if (!have_chap_secret(ppp_settings.remote_name, ppp_settings.our_name, remote))
  445.             go->neg_chap = 0;
  446.     }
  447. }
  448. #if PAP_SUPPORT > 0
  449. /*
  450.  * check_passwd - Check the user name and passwd against the PAP secrets
  451.  * file.  If requested, also check against the system password database,
  452.  * and login the user if OK.
  453.  *
  454.  * returns:
  455.  *  UPAP_AUTHNAK: Authentication failed.
  456.  *  UPAP_AUTHACK: Authentication succeeded.
  457.  * In either case, msg points to an appropriate message.
  458.  */
  459. int check_passwd(
  460. int unit,
  461. char *auser,
  462. int userlen,
  463. char *apasswd,
  464. int passwdlen,
  465. char **msg,
  466. int *msglen
  467. )
  468. {
  469. #if 1
  470. *msg = (char *) 0;
  471. return UPAP_AUTHACK;     /* XXX Assume all entries OK. */
  472. #else
  473.     int ret = 0;
  474.     struct wordlist *addrs = NULL;
  475.     char passwd[256], user[256];
  476.     char secret[MAXWORDLEN];
  477.     static u_short attempts = 0;
  478.     
  479.     /*
  480.      * Make copies of apasswd and auser, then null-terminate them.
  481.      */
  482.     BCOPY(apasswd, passwd, passwdlen);
  483.     passwd[passwdlen] = '';
  484.     BCOPY(auser, user, userlen);
  485.     user[userlen] = '';
  486.     *msg = (char *) 0;
  487.     /* XXX Validate user name and password. */
  488.     ret = UPAP_AUTHACK;     /* XXX Assume all entries OK. */
  489.         
  490.     if (ret == UPAP_AUTHNAK) {
  491.         if (*msg == (char *) 0)
  492.             *msg = "Login incorrect";
  493.         *msglen = strlen(*msg);
  494.         /*
  495.          * Frustrate passwd stealer programs.
  496.          * Allow 10 tries, but start backing off after 3 (stolen from login).
  497.          * On 10'th, drop the connection.
  498.          */
  499.         if (attempts++ >= 10) {
  500.             AUTHDEBUG((LOG_WARNING, "%d LOGIN FAILURES BY %sn", attempts, user));
  501.             /*ppp_panic("Excess Bad Logins");*/
  502.         }
  503.         if (attempts > 3) {
  504.             sys_msleep((attempts - 3) * 5);
  505.         }
  506.         if (addrs != NULL) {
  507.             free_wordlist(addrs);
  508.         }
  509.     } else {
  510.         attempts = 0;           /* Reset count */
  511.         if (*msg == (char *) 0)
  512.             *msg = "Login ok";
  513.         *msglen = strlen(*msg);
  514.         set_allowed_addrs(unit, addrs);
  515.     }
  516.     
  517.     BZERO(passwd, sizeof(passwd));
  518.     BZERO(secret, sizeof(secret));
  519.     
  520.     return ret;
  521. #endif
  522. }
  523. #endif
  524. /*
  525.  * auth_ip_addr - check whether the peer is authorized to use
  526.  * a given IP address.  Returns 1 if authorized, 0 otherwise.
  527.  */
  528. int auth_ip_addr(int unit, u32_t addr)
  529. {
  530.     return ip_addr_check(addr, addresses[unit]);
  531. }
  532. /*
  533.  * bad_ip_adrs - return 1 if the IP address is one we don't want
  534.  * to use, such as an address in the loopback net or a multicast address.
  535.  * addr is in network byte order.
  536.  */
  537. int bad_ip_adrs(u32_t addr)
  538. {
  539.     addr = ntohl(addr);
  540.     return (addr >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET
  541.         || IN_MULTICAST(addr) || IN_BADCLASS(addr);
  542. }
  543. #if CHAP_SUPPORT > 0
  544. /*
  545.  * get_secret - open the CHAP secret file and return the secret
  546.  * for authenticating the given client on the given server.
  547.  * (We could be either client or server).
  548.  */
  549. int get_secret(
  550.     int unit,
  551.     char *client,
  552.     char *server,
  553.     char *secret,
  554.     int *secret_len,
  555.     int save_addrs
  556. )
  557. {
  558. #if 1
  559.     int len;
  560.     struct wordlist *addrs;
  561.     
  562.     addrs = NULL;
  563.     if(!client || !client[0] || strcmp(client, ppp_settings.user)) {
  564. return 0;
  565.     }
  566.     len = strlen(ppp_settings.passwd);
  567.     if (len > MAXSECRETLEN) {
  568.         AUTHDEBUG((LOG_ERR, "Secret for %s on %s is too longn", client, server));
  569.         len = MAXSECRETLEN;
  570.     }
  571.     BCOPY(ppp_settings.passwd, secret, len);
  572.     *secret_len = len;
  573.     
  574.     return 1;
  575. #else
  576.     int ret = 0, len;
  577.     struct wordlist *addrs;
  578.     char secbuf[MAXWORDLEN];
  579.     
  580.     addrs = NULL;
  581.     secbuf[0] = 0;
  582.     /* XXX Find secret. */  
  583.     if (ret < 0)
  584.         return 0;
  585.     
  586.     if (save_addrs)
  587.         set_allowed_addrs(unit, addrs);
  588.     
  589.     len = strlen(secbuf);
  590.     if (len > MAXSECRETLEN) {
  591.         AUTHDEBUG((LOG_ERR, "Secret for %s on %s is too longn", client, server));
  592.         len = MAXSECRETLEN;
  593.     }
  594.     BCOPY(secbuf, secret, len);
  595.     BZERO(secbuf, sizeof(secbuf));
  596.     *secret_len = len;
  597.     
  598.     return 1;
  599. #endif
  600. }
  601. #endif
  602. #if 0 /* UNUSED */
  603. /*
  604.  * auth_check_options - called to check authentication options.
  605.  */
  606. void auth_check_options(void)
  607. {
  608.     lcp_options *wo = &lcp_wantoptions[0];
  609.     int can_auth;
  610.     ipcp_options *ipwo = &ipcp_wantoptions[0];
  611.     u32_t remote;
  612.     
  613.     /* Default our_name to hostname, and user to our_name */
  614.     if (ppp_settings.our_name[0] == 0 || ppp_settings.usehostname)
  615.         strcpy(ppp_settings.our_name, ppp_settings.hostname);
  616.     if (ppp_settings.user[0] == 0)
  617.         strcpy(ppp_settings.user, ppp_settings.our_name);
  618.     
  619.     /* If authentication is required, ask peer for CHAP or PAP. */
  620.     if (ppp_settings.auth_required && !wo->neg_chap && !wo->neg_upap) {
  621.         wo->neg_chap = 1;
  622.         wo->neg_upap = 1;
  623.     }
  624.     
  625.     /*
  626.      * Check whether we have appropriate secrets to use
  627.      * to authenticate the peer.
  628.      */
  629.     can_auth = wo->neg_upap && have_pap_secret();
  630.     if (!can_auth && wo->neg_chap) {
  631.         remote = ipwo->accept_remote? 0: ipwo->hisaddr;
  632.         can_auth = have_chap_secret(ppp_settings.remote_name, ppp_settings.our_name, remote);
  633.     }
  634.     
  635.     if (ppp_settings.auth_required && !can_auth) {
  636.         ppp_panic("No auth secret");
  637.     }
  638. }
  639. #endif
  640. /**********************************/
  641. /*** LOCAL FUNCTION DEFINITIONS ***/
  642. /**********************************/
  643. /*
  644.  * Proceed to the network phase.
  645.  */
  646. static void network_phase(int unit)
  647. {
  648.     int i;
  649.     struct protent *protp;
  650.     lcp_options *go = &lcp_gotoptions[unit];
  651.     
  652.     /*
  653.      * If the peer had to authenticate, run the auth-up script now.
  654.      */
  655.     if ((go->neg_chap || go->neg_upap) && !did_authup) {
  656.         /* XXX Do setup for peer authentication. */
  657.         did_authup = 1;
  658.     }
  659.     
  660. #if CBCP_SUPPORT > 0
  661.     /*
  662.      * If we negotiated callback, do it now.
  663.      */
  664.     if (go->neg_cbcp) {
  665.         lcp_phase[unit] = PHASE_CALLBACK;
  666.         (*cbcp_protent.open)(unit);
  667.         return;
  668.     }
  669. #endif
  670.     
  671.     lcp_phase[unit] = PHASE_NETWORK;
  672.     for (i = 0; (protp = ppp_protocols[i]) != NULL; ++i)
  673.         if (protp->protocol < 0xC000 && protp->enabled_flag
  674.                 && protp->open != NULL) {
  675.             (*protp->open)(unit);
  676.             if (protp->protocol != PPP_CCP)
  677.                 ++num_np_open;
  678.         }
  679.     
  680.     if (num_np_open == 0)
  681.         /* nothing to do */
  682.         lcp_close(0, "No network protocols running");
  683. }
  684. /*
  685.  * check_idle - check whether the link has been idle for long
  686.  * enough that we can shut it down.
  687.  */
  688. static void check_idle(void *arg)
  689. {
  690.     struct ppp_idle idle;
  691.     u_short itime;
  692.     
  693. (void)arg;
  694.     if (!get_idle_time(0, &idle))
  695.         return;
  696.     itime = LWIP_MIN(idle.xmit_idle, idle.recv_idle);
  697.     if (itime >= ppp_settings.idle_time_limit) {
  698.         /* link is idle: shut it down. */
  699.         AUTHDEBUG((LOG_INFO, "Terminating connection due to lack of activity.n"));
  700.         lcp_close(0, "Link inactive");
  701.     } else {
  702.         TIMEOUT(check_idle, NULL, ppp_settings.idle_time_limit - itime);
  703.     }
  704. }
  705. /*
  706.  * connect_time_expired - log a message and close the connection.
  707.  */
  708. static void connect_time_expired(void *arg)
  709. {
  710. (void)arg;
  711.     AUTHDEBUG((LOG_INFO, "Connect time expiredn"));
  712.     lcp_close(0, "Connect time expired");   /* Close connection */
  713. }
  714. #if 0
  715. /*
  716.  * login - Check the user name and password against the system
  717.  * password database, and login the user if OK.
  718.  *
  719.  * returns:
  720.  *  UPAP_AUTHNAK: Login failed.
  721.  *  UPAP_AUTHACK: Login succeeded.
  722.  * In either case, msg points to an appropriate message.
  723.  */
  724. static int login(char *user, char *passwd, char **msg, int *msglen)
  725. {
  726.     /* XXX Fail until we decide that we want to support logins. */
  727.     return (UPAP_AUTHNAK);
  728. }
  729. #endif
  730. /*
  731.  * logout - Logout the user.
  732.  */
  733. static void logout(void)
  734. {
  735.     logged_in = 0;
  736. }
  737. /*
  738.  * null_login - Check if a username of "" and a password of "" are
  739.  * acceptable, and iff so, set the list of acceptable IP addresses
  740.  * and return 1.
  741.  */
  742. static int null_login(int unit)
  743. {
  744. (void)unit;
  745.     /* XXX Fail until we decide that we want to support logins. */
  746.     return 0;
  747. }
  748. /*
  749.  * get_pap_passwd - get a password for authenticating ourselves with
  750.  * our peer using PAP.  Returns 1 on success, 0 if no suitable password
  751.  * could be found.
  752.  */
  753. static int get_pap_passwd(int unit, char *user, char *passwd)
  754. {
  755. /* normally we would reject PAP if no password is provided,
  756.    but this causes problems with some providers (like CHT in Taiwan)
  757.    who incorrectly request PAP and expect a bogus/empty password, so
  758.    always provide a default user/passwd of "none"/"none"
  759. */
  760.     if(user)
  761.      strcpy(user,   "none");
  762.     if(passwd)
  763.      strcpy(passwd, "none");
  764.     return 1;
  765. }
  766. /*
  767.  * have_pap_secret - check whether we have a PAP file with any
  768.  * secrets that we could possibly use for authenticating the peer.
  769.  */
  770. static int have_pap_secret(void)
  771. {
  772.     /* XXX Fail until we set up our passwords. */
  773.     return 0;
  774. }
  775. /*
  776.  * have_chap_secret - check whether we have a CHAP file with a
  777.  * secret that we could possibly use for authenticating `client'
  778.  * on `server'.  Either can be the null string, meaning we don't
  779.  * know the identity yet.
  780.  */
  781. static int have_chap_secret(char *client, char *server, u32_t remote)
  782. {
  783. (void)client;
  784. (void)server;
  785. (void)remote;
  786.     /* XXX Fail until we set up our passwords. */
  787.     return 0;
  788. }
  789. #if 0 /* PAP_SUPPORT > 0 || CHAP_SUPPORT > 0 */
  790. /*
  791.  * set_allowed_addrs() - set the list of allowed addresses.
  792.  */
  793. static void set_allowed_addrs(int unit, struct wordlist *addrs)
  794. {
  795.     if (addresses[unit] != NULL)
  796.         free_wordlist(addresses[unit]);
  797.     addresses[unit] = addrs;
  798. #if 0
  799.     /*
  800.      * If there's only one authorized address we might as well
  801.      * ask our peer for that one right away
  802.      */
  803.     if (addrs != NULL && addrs->next == NULL) {
  804.         char *p = addrs->word;
  805.         struct ipcp_options *wo = &ipcp_wantoptions[unit];
  806.         u32_t a;
  807.         struct hostent *hp;
  808.         
  809.         if (wo->hisaddr == 0 && *p != '!' && *p != '-'
  810.                 && strchr(p, '/') == NULL) {
  811.             hp = gethostbyname(p);
  812.             if (hp != NULL && hp->h_addrtype == AF_INET)
  813.                 a = *(u32_t *)hp->h_addr;
  814.             else
  815.                 a = inet_addr(p);
  816.             if (a != (u32_t) -1)
  817.                 wo->hisaddr = a;
  818.         }
  819.     }
  820. #endif
  821. }
  822. #endif
  823. static int ip_addr_check(u32_t addr, struct wordlist *addrs)
  824. {
  825.     
  826.     /* don't allow loopback or multicast address */
  827.     if (bad_ip_adrs(addr))
  828.         return 0;
  829.     
  830.     if (addrs == NULL)
  831.         return !ppp_settings.auth_required;      /* no addresses authorized */
  832.     
  833.     /* XXX All other addresses allowed. */
  834.     return 1;
  835. }
  836. #if 0 /* PAP_SUPPORT > 0 || CHAP_SUPPORT */
  837. /*
  838.  * free_wordlist - release memory allocated for a wordlist.
  839.  */
  840. static void free_wordlist(struct wordlist *wp)
  841. {
  842.     struct wordlist *next;
  843.     
  844.     while (wp != NULL) {
  845.         next = wp->next;
  846.         free(wp);
  847.         wp = next;
  848.     }
  849. }
  850. #endif
  851. #endif /* PPP_SUPPORT */