/*****************************************************************************
* auth.c - Network Authentication and Phase Control program file.
*
* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
* Copyright (c) 1997 by Global Election Systems Inc.  All rights reserved.
*
* The authors hereby grant permission to use, copy, modify, distribute,
* and license this software and its documentation for any purpose, provided
* that existing copyright notices are retained in all copies and that this
* notice and the following disclaimer are included verbatim in any 
* distributions. No written agreement, license, or royalty fee is required
* for any of the authorized uses.
*
* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
* REVISION HISTORY
*
* 03-01-01 Marc Boucher <marc@mbsi.ca>
*   Ported to lwIP.
* 97-12-08 Guy Lancaster <lancasterg@acm.org>, Global Election Systems Inc.
*   Ported from public pppd code.
*****************************************************************************/
/*
 * auth.c - PPP authentication and phase control.
 *
 * Copyright (c) 1993 The Australian National University.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms are permitted
 * provided that the above copyright notice and this paragraph are
 * duplicated in all such forms and that any documentation,
 * advertising materials, and other materials related to such
 * distribution and use acknowledge that the software was developed
 * by the Australian National University.  The name of the University
 * may not be used to endorse or promote products derived from this
 * software without specific prior written permission.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 *
 * Copyright (c) 1989 Carnegie Mellon University.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms are permitted
 * provided that the above copyright notice and this paragraph are
 * duplicated in all such forms and that any documentation,
 * advertising materials, and other materials related to such
 * distribution and use acknowledge that the software was developed
 * by Carnegie Mellon University.  The name of the
 * University may not be used to endorse or promote products derived
 * from this software without specific prior written permission.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */

#include "ppp.h"
#if PPP_SUPPORT > 0
#include "fsm.h"
#include "lcp.h"
#include "pap.h"
#include "chap.h"
#include "auth.h"
#include "ipcp.h"

#if CBCP_SUPPORT > 0
#include "cbcp.h"
#endif

#include "pppdebug.h"


/*************************/
/*** LOCAL DEFINITIONS ***/
/*************************/

/* Bits in auth_pending[] */
#define PAP_WITHPEER    1
#define PAP_PEER    2
#define CHAP_WITHPEER   4
#define CHAP_PEER   8


                                                                    
/************************/
/*** LOCAL DATA TYPES ***/
/************************/
/* Used for storing a sequence of words.  Usually malloced. */
struct wordlist {
    struct wordlist *next;
    char        word[1];
};



/***********************************/
/*** LOCAL FUNCTION DECLARATIONS ***/
/***********************************/
extern char *crypt (const char *, const char *);

/* Prototypes for procedures local to this file. */

static void network_phase (int);
static void check_idle (void *);
static void connect_time_expired (void *);
#if 0
static int  login (char *, char *, char **, int *);
#endif
static void logout (void);
static int  null_login (int);
static int  get_pap_passwd (int, char *, char *);
static int  have_pap_secret (void);
static int  have_chap_secret (char *, char *, u32_t);
static int  ip_addr_check (u32_t, struct wordlist *);
#if 0 /* PAP_SUPPORT > 0 || CHAP_SUPPORT > 0 */
static void set_allowed_addrs(int unit, struct wordlist *addrs);
static void free_wordlist (struct wordlist *);
#endif
#if CBCP_SUPPORT > 0
static void callback_phase (int);
#endif


/******************************/
/*** PUBLIC DATA STRUCTURES ***/
/******************************/


/*****************************/
/*** LOCAL DATA STRUCTURES ***/
/*****************************/
#if PAP_SUPPORT > 0 || CHAP_SUPPORT > 0
/* The name by which the peer authenticated itself to us. */
static char peer_authname[MAXNAMELEN];
#endif

/* Records which authentication operations haven't completed yet. */
static int auth_pending[NUM_PPP];

/* Set if we have successfully called login() */
static int logged_in;

/* Set if we have run the /etc/ppp/auth-up script. */
static int did_authup;

/* List of addresses which the peer may use. */
static struct wordlist *addresses[NUM_PPP];

/* Number of network protocols which we have opened. */
static int num_np_open;

/* Number of network protocols which have come up. */
static int num_np_up;

#if PAP_SUPPORT > 0 || CHAP_SUPPORT > 0
/* Set if we got the contents of passwd[] from the pap-secrets file. */
static int passwd_from_file;
#endif



/***********************************/
/*** PUBLIC FUNCTION DEFINITIONS ***/
/***********************************/
/*
 * An Open on LCP has requested a change from Dead to Establish phase.
 * Do what's necessary to bring the physical layer up.
 */
void link_required(int unit)
{
    AUTHDEBUG((LOG_INFO, "link_required: %d\n", unit));
}

/*
 * LCP has terminated the link; go to the Dead phase and take the
 * physical layer down.
 */
void link_terminated(int unit)
{
    AUTHDEBUG((LOG_INFO, "link_terminated: %d\n", unit));
    
    if (lcp_phase[unit] == PHASE_DEAD)
        return;
    if (logged_in)
        logout();
    lcp_phase[unit] = PHASE_DEAD;
    AUTHDEBUG((LOG_NOTICE, "Connection terminated.\n"));
	pppMainWakeup(unit);
}

/*
 * LCP has gone down; it will either die or try to re-establish.
 */
void link_down(int unit)
{
    int i;
    struct protent *protp;
    
    AUTHDEBUG((LOG_INFO, "link_down: %d\n", unit));
    if (did_authup) {
        /* XXX Do link down processing. */
        did_authup = 0;
    }
    for (i = 0; (protp = ppp_protocols[i]) != NULL; ++i) {
        if (!protp->enabled_flag)
            continue;
        if (protp->protocol != PPP_LCP && protp->lowerdown != NULL)
            (*protp->lowerdown)(unit);
        if (protp->protocol < 0xC000 && protp->close != NULL)
            (*protp->close)(unit, "LCP down");
    }
    num_np_open = 0;
    num_np_up = 0;
    if (lcp_phase[unit] != PHASE_DEAD)
        lcp_phase[unit] = PHASE_TERMINATE;
	pppMainWakeup(unit);
}

/*
 * The link is established.
 * Proceed to the Dead, Authenticate or Network phase as appropriate.
 */
void link_established(int unit)
{
    int auth;
    int i;
    struct protent *protp;
    lcp_options *wo = &lcp_wantoptions[unit];
    lcp_options *go = &lcp_gotoptions[unit];
#if PAP_SUPPORT > 0 || CHAP_SUPPORT > 0
    lcp_options *ho = &lcp_hisoptions[unit];
#endif
    
    AUTHDEBUG((LOG_INFO, "link_established: %d\n", unit));
    /*
     * Tell higher-level protocols that LCP is up.
     */
    for (i = 0; (protp = ppp_protocols[i]) != NULL; ++i)
        if (protp->protocol != PPP_LCP && protp->enabled_flag
                && protp->lowerup != NULL)
            (*protp->lowerup)(unit);
    
    if (ppp_settings.auth_required && !(go->neg_chap || go->neg_upap)) {
        /*
         * We wanted the peer to authenticate itself, and it refused:
         * treat it as though it authenticated with PAP using a username
         * of "" and a password of "".  If that's not OK, boot it out.
         */
        if (!wo->neg_upap || !null_login(unit)) {
            AUTHDEBUG((LOG_WARNING, "peer refused to authenticate\n"));
            lcp_close(unit, "peer refused to authenticate");
            return;
        }
    }
    
    lcp_phase[unit] = PHASE_AUTHENTICATE;
    auth = 0;
#if CHAP_SUPPORT > 0
    if (go->neg_chap) {
        ChapAuthPeer(unit, ppp_settings.our_name, go->chap_mdtype);
        auth |= CHAP_PEER;
    } 
#endif
#if PAP_SUPPORT > 0 && CHAP_SUPPORT > 0
    else
#endif
#if PAP_SUPPORT > 0
    if (go->neg_upap) {
        upap_authpeer(unit);
        auth |= PAP_PEER;
    }
#endif
#if CHAP_SUPPORT > 0
    if (ho->neg_chap) {
        ChapAuthWithPeer(unit, ppp_settings.user, ho->chap_mdtype);
        auth |= CHAP_WITHPEER;
    }
#endif
#if PAP_SUPPORT > 0 && CHAP_SUPPORT > 0
    else
#endif
#if PAP_SUPPORT > 0
    if (ho->neg_upap) {
        if (ppp_settings.passwd[0] == 0) {
            passwd_from_file = 1;
            if (!get_pap_passwd(unit, ppp_settings.user, ppp_settings.passwd))
                AUTHDEBUG((LOG_ERR, "No secret found for PAP login\n"));
        }
        upap_authwithpeer(unit, ppp_settings.user, ppp_settings.passwd);
        auth |= PAP_WITHPEER;
    }
#endif
    auth_pending[unit] = auth;
    
    if (!auth)
        network_phase(unit);
}


/*
 * The peer has failed to authenticate himself using `protocol'.
 */
void auth_peer_fail(int unit, u16_t protocol)
{
    AUTHDEBUG((LOG_INFO, "auth_peer_fail: %d proto=%X\n", unit, protocol));
    /*
     * Authentication failure: take the link down
     */
    lcp_close(unit, "Authentication failed");
}


#if PAP_SUPPORT > 0 || CHAP_SUPPORT > 0
/*
 * The peer has been successfully authenticated using `protocol'.
 */
void auth_peer_success(int unit, u16_t protocol, char *name, int namelen)
{
    int pbit;
    
    AUTHDEBUG((LOG_INFO, "auth_peer_success: %d proto=%X\n", unit, protocol));
    switch (protocol) {
    case PPP_CHAP:
        pbit = CHAP_PEER;
        break;
    case PPP_PAP:
        pbit = PAP_PEER;
        break;
    default:
        AUTHDEBUG((LOG_WARNING, "auth_peer_success: unknown protocol %x\n",
               protocol));
        return;
    }
    
    /*
     * Save the authenticated name of the peer for later.
     */
    if (namelen > sizeof(peer_authname) - 1)
        namelen = sizeof(peer_authname) - 1;
    BCOPY(name, peer_authname, namelen);
    peer_authname[namelen] = 0;
    
    /*
     * If there is no more authentication still to be done,
     * proceed to the network (or callback) phase.
     */
    if ((auth_pending[unit] &= ~pbit) == 0)
        network_phase(unit);
}

/*
 * We have failed to authenticate ourselves to the peer using `protocol'.
 */
void auth_withpeer_fail(int unit, u16_t protocol)
{
    int errCode = PPPERR_AUTHFAIL;
    
    AUTHDEBUG((LOG_INFO, "auth_withpeer_fail: %d proto=%X\n", unit, protocol));
    if (passwd_from_file)
        BZERO(ppp_settings.passwd, MAXSECRETLEN);
    /* 
     * XXX Warning: the unit number indicates the interface which is
     * not necessarily the PPP connection.  It works here as long
     * as we are only supporting PPP interfaces.
     */
    pppIOCtl(unit, PPPCTLS_ERRCODE, &errCode);

    /*
     * We've failed to authenticate ourselves to our peer.
     * He'll probably take the link down, and there's not much
     * we can do except wait for that.
     */
}

/*
 * We have successfully authenticated ourselves with the peer using `protocol'.
 */
void auth_withpeer_success(int unit, u16_t protocol)
{
    int pbit;
    
    AUTHDEBUG((LOG_INFO, "auth_withpeer_success: %d proto=%X\n", unit, protocol));
    switch (protocol) {
    case PPP_CHAP:
        pbit = CHAP_WITHPEER;
        break;
    case PPP_PAP:
        if (passwd_from_file)
            BZERO(ppp_settings.passwd, MAXSECRETLEN);
        pbit = PAP_WITHPEER;
        break;
    default:
        AUTHDEBUG((LOG_WARNING, "auth_peer_success: unknown protocol %x\n",
               protocol));
        pbit = 0;
    }
    
    /*
     * If there is no more authentication still being done,
     * proceed to the network (or callback) phase.
     */
    if ((auth_pending[unit] &= ~pbit) == 0)
        network_phase(unit);
}
#endif


/*
 * np_up - a network protocol has come up.
 */
void np_up(int unit, u16_t proto)
{
    AUTHDEBUG((LOG_INFO, "np_up: %d proto=%X\n", unit, proto));
    if (num_np_up == 0) {
	AUTHDEBUG((LOG_INFO, "np_up: maxconnect=%d idle_time_limit=%d\n",ppp_settings.maxconnect,ppp_settings.idle_time_limit));
        /*
         * At this point we consider that the link has come up successfully.
         */
        if (ppp_settings.idle_time_limit > 0)
            TIMEOUT(check_idle, NULL, ppp_settings.idle_time_limit);
        
        /*
         * Set a timeout to close the connection once the maximum
         * connect time has expired.
         */
        if (ppp_settings.maxconnect > 0)
            TIMEOUT(connect_time_expired, 0, ppp_settings.maxconnect);
    }
    ++num_np_up;
}

/*
 * np_down - a network protocol has gone down.
 */
void np_down(int unit, u16_t proto)
{
    AUTHDEBUG((LOG_INFO, "np_down: %d proto=%X\n", unit, proto));
    if (--num_np_up == 0 && ppp_settings.idle_time_limit > 0) {
        UNTIMEOUT(check_idle, NULL);
    }
}

/*
 * np_finished - a network protocol has finished using the link.
 */
void np_finished(int unit, u16_t proto)
{
    AUTHDEBUG((LOG_INFO, "np_finished: %d proto=%X\n", unit, proto));
    if (--num_np_open <= 0) {
        /* no further use for the link: shut up shop. */
        lcp_close(0, "No network protocols running");
    }
}

/*
 * auth_reset - called when LCP is starting negotiations to recheck
 * authentication options, i.e. whether we have appropriate secrets
 * to use for authenticating ourselves and/or the peer.
 */
void auth_reset(int unit)
{
    lcp_options *go = &lcp_gotoptions[unit];
    lcp_options *ao = &lcp_allowoptions[0];
    ipcp_options *ipwo = &ipcp_wantoptions[0];
    u32_t remote;
    
    AUTHDEBUG((LOG_INFO, "auth_reset: %d\n", unit));
    ao->neg_upap = !ppp_settings.refuse_pap && (ppp_settings.passwd[0] != 0 || get_pap_passwd(unit, NULL, NULL));
    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)*/;
    
    if (go->neg_upap && !have_pap_secret())
        go->neg_upap = 0;
    if (go->neg_chap) {
        remote = ipwo->accept_remote? 0: ipwo->hisaddr;
        if (!have_chap_secret(ppp_settings.remote_name, ppp_settings.our_name, remote))
            go->neg_chap = 0;
    }
}


#if PAP_SUPPORT > 0
/*
 * check_passwd - Check the user name and passwd against the PAP secrets
 * file.  If requested, also check against the system password database,
 * and login the user if OK.
 *
 * returns:
 *  UPAP_AUTHNAK: Authentication failed.
 *  UPAP_AUTHACK: Authentication succeeded.
 * In either case, msg points to an appropriate message.
 */
int check_passwd(
	int unit,
	char *auser,
	int userlen,
	char *apasswd,
	int passwdlen,
	char **msg,
	int *msglen
)
{
#if 1
	*msg = (char *) 0;
	return UPAP_AUTHACK;     /* XXX Assume all entries OK. */
#else
    int ret = 0;
    struct wordlist *addrs = NULL;
    char passwd[256], user[256];
    char secret[MAXWORDLEN];
    static u_short attempts = 0;
    
    /*
     * Make copies of apasswd and auser, then null-terminate them.
     */
    BCOPY(apasswd, passwd, passwdlen);
    passwd[passwdlen] = '\0';
    BCOPY(auser, user, userlen);
    user[userlen] = '\0';
    *msg = (char *) 0;

    /* XXX Validate user name and password. */
    ret = UPAP_AUTHACK;     /* XXX Assume all entries OK. */
        
    if (ret == UPAP_AUTHNAK) {
        if (*msg == (char *) 0)
            *msg = "Login incorrect";
        *msglen = strlen(*msg);
        /*
         * Frustrate passwd stealer programs.
         * Allow 10 tries, but start backing off after 3 (stolen from login).
         * On 10'th, drop the connection.
         */
        if (attempts++ >= 10) {
            AUTHDEBUG((LOG_WARNING, "%d LOGIN FAILURES BY %s\n", attempts, user));
            /*ppp_panic("Excess Bad Logins");*/
        }
        if (attempts > 3) {
            sys_msleep((attempts - 3) * 5);
        }
        if (addrs != NULL) {
            free_wordlist(addrs);
        }
    } else {
        attempts = 0;           /* Reset count */
        if (*msg == (char *) 0)
            *msg = "Login ok";
        *msglen = strlen(*msg);
        set_allowed_addrs(unit, addrs);
    }
    
    BZERO(passwd, sizeof(passwd));
    BZERO(secret, sizeof(secret));
    
    return ret;
#endif
}
#endif


/*
 * auth_ip_addr - check whether the peer is authorized to use
 * a given IP address.  Returns 1 if authorized, 0 otherwise.
 */
int auth_ip_addr(int unit, u32_t addr)
{
    return ip_addr_check(addr, addresses[unit]);
}

/*
 * bad_ip_adrs - return 1 if the IP address is one we don't want
 * to use, such as an address in the loopback net or a multicast address.
 * addr is in network byte order.
 */
int bad_ip_adrs(u32_t addr)
{
    addr = ntohl(addr);
    return (addr >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET
        || IN_MULTICAST(addr) || IN_BADCLASS(addr);
}


#if CHAP_SUPPORT > 0
/*
 * get_secret - open the CHAP secret file and return the secret
 * for authenticating the given client on the given server.
 * (We could be either client or server).
 */
int get_secret(
    int unit,
    char *client,
    char *server,
    char *secret,
    int *secret_len,
    int save_addrs
)
{
#if 1
    int len;
    struct wordlist *addrs;
    
    addrs = NULL;

    if(!client || !client[0] || strcmp(client, ppp_settings.user)) {
	return 0;
    }

    len = strlen(ppp_settings.passwd);
    if (len > MAXSECRETLEN) {
        AUTHDEBUG((LOG_ERR, "Secret for %s on %s is too long\n", client, server));
        len = MAXSECRETLEN;
    }
    BCOPY(ppp_settings.passwd, secret, len);
    *secret_len = len;
    
    return 1;
#else
    int ret = 0, len;
    struct wordlist *addrs;
    char secbuf[MAXWORDLEN];
    
    addrs = NULL;
    secbuf[0] = 0;

    /* XXX Find secret. */  
    if (ret < 0)
        return 0;
    
    if (save_addrs)
        set_allowed_addrs(unit, addrs);
    
    len = strlen(secbuf);
    if (len > MAXSECRETLEN) {
        AUTHDEBUG((LOG_ERR, "Secret for %s on %s is too long\n", client, server));
        len = MAXSECRETLEN;
    }
    BCOPY(secbuf, secret, len);
    BZERO(secbuf, sizeof(secbuf));
    *secret_len = len;
    
    return 1;
#endif
}
#endif


#if 0 /* UNUSED */
/*
 * auth_check_options - called to check authentication options.
 */
void auth_check_options(void)
{
    lcp_options *wo = &lcp_wantoptions[0];
    int can_auth;
    ipcp_options *ipwo = &ipcp_wantoptions[0];
    u32_t remote;
    
    /* Default our_name to hostname, and user to our_name */
    if (ppp_settings.our_name[0] == 0 || ppp_settings.usehostname)
        strcpy(ppp_settings.our_name, ppp_settings.hostname);
    if (ppp_settings.user[0] == 0)
        strcpy(ppp_settings.user, ppp_settings.our_name);
    
    /* If authentication is required, ask peer for CHAP or PAP. */
    if (ppp_settings.auth_required && !wo->neg_chap && !wo->neg_upap) {
        wo->neg_chap = 1;
        wo->neg_upap = 1;
    }
    
    /*
     * Check whether we have appropriate secrets to use
     * to authenticate the peer.
     */
    can_auth = wo->neg_upap && have_pap_secret();
    if (!can_auth && wo->neg_chap) {
        remote = ipwo->accept_remote? 0: ipwo->hisaddr;
        can_auth = have_chap_secret(ppp_settings.remote_name, ppp_settings.our_name, remote);
    }
    
    if (ppp_settings.auth_required && !can_auth) {
        ppp_panic("No auth secret");
    }
}
#endif


/**********************************/
/*** LOCAL FUNCTION DEFINITIONS ***/
/**********************************/
/*
 * Proceed to the network phase.
 */
static void network_phase(int unit)
{
    int i;
    struct protent *protp;
    lcp_options *go = &lcp_gotoptions[unit];
    
    /*
     * If the peer had to authenticate, run the auth-up script now.
     */
    if ((go->neg_chap || go->neg_upap) && !did_authup) {
        /* XXX Do setup for peer authentication. */
        did_authup = 1;
    }
    
#if CBCP_SUPPORT > 0
    /*
     * If we negotiated callback, do it now.
     */
    if (go->neg_cbcp) {
        lcp_phase[unit] = PHASE_CALLBACK;
        (*cbcp_protent.open)(unit);
        return;
    }
#endif
    
    lcp_phase[unit] = PHASE_NETWORK;
    for (i = 0; (protp = ppp_protocols[i]) != NULL; ++i)
        if (protp->protocol < 0xC000 && protp->enabled_flag
                && protp->open != NULL) {
            (*protp->open)(unit);
            if (protp->protocol != PPP_CCP)
                ++num_np_open;
        }
    
    if (num_np_open == 0)
        /* nothing to do */
        lcp_close(0, "No network protocols running");
}

/*
 * check_idle - check whether the link has been idle for long
 * enough that we can shut it down.
 */
static void check_idle(void *arg)
{
    struct ppp_idle idle;
    u_short itime;
    
	(void)arg;
    if (!get_idle_time(0, &idle))
        return;
    itime = LWIP_MIN(idle.xmit_idle, idle.recv_idle);
    if (itime >= ppp_settings.idle_time_limit) {
        /* link is idle: shut it down. */
        AUTHDEBUG((LOG_INFO, "Terminating connection due to lack of activity.\n"));
        lcp_close(0, "Link inactive");
    } else {
        TIMEOUT(check_idle, NULL, ppp_settings.idle_time_limit - itime);
    }
}

/*
 * connect_time_expired - log a message and close the connection.
 */
static void connect_time_expired(void *arg)
{
	(void)arg;

    AUTHDEBUG((LOG_INFO, "Connect time expired\n"));
    lcp_close(0, "Connect time expired");   /* Close connection */
}

#if 0
/*
 * login - Check the user name and password against the system
 * password database, and login the user if OK.
 *
 * returns:
 *  UPAP_AUTHNAK: Login failed.
 *  UPAP_AUTHACK: Login succeeded.
 * In either case, msg points to an appropriate message.
 */
static int login(char *user, char *passwd, char **msg, int *msglen)
{
    /* XXX Fail until we decide that we want to support logins. */
    return (UPAP_AUTHNAK);
}
#endif

/*
 * logout - Logout the user.
 */
static void logout(void)
{
    logged_in = 0;
}


/*
 * null_login - Check if a username of "" and a password of "" are
 * acceptable, and iff so, set the list of acceptable IP addresses
 * and return 1.
 */
static int null_login(int unit)
{
	(void)unit;
    /* XXX Fail until we decide that we want to support logins. */
    return 0;
}


/*
 * get_pap_passwd - get a password for authenticating ourselves with
 * our peer using PAP.  Returns 1 on success, 0 if no suitable password
 * could be found.
 */
static int get_pap_passwd(int unit, char *user, char *passwd)
{
/* normally we would reject PAP if no password is provided,
   but this causes problems with some providers (like CHT in Taiwan)
   who incorrectly request PAP and expect a bogus/empty password, so
   always provide a default user/passwd of "none"/"none"
*/
    if(user)
    	strcpy(user,   "none");
    if(passwd)
    	strcpy(passwd, "none");

    return 1;
}


/*
 * have_pap_secret - check whether we have a PAP file with any
 * secrets that we could possibly use for authenticating the peer.
 */
static int have_pap_secret(void)
{
    /* XXX Fail until we set up our passwords. */
    return 0;
}


/*
 * have_chap_secret - check whether we have a CHAP file with a
 * secret that we could possibly use for authenticating `client'
 * on `server'.  Either can be the null string, meaning we don't
 * know the identity yet.
 */
static int have_chap_secret(char *client, char *server, u32_t remote)
{
	(void)client;
	(void)server;
	(void)remote;
    /* XXX Fail until we set up our passwords. */
    return 0;
}


#if 0 /* PAP_SUPPORT > 0 || CHAP_SUPPORT > 0 */
/*
 * set_allowed_addrs() - set the list of allowed addresses.
 */
static void set_allowed_addrs(int unit, struct wordlist *addrs)
{
    if (addresses[unit] != NULL)
        free_wordlist(addresses[unit]);
    addresses[unit] = addrs;

#if 0
    /*
     * If there's only one authorized address we might as well
     * ask our peer for that one right away
     */
    if (addrs != NULL && addrs->next == NULL) {
        char *p = addrs->word;
        struct ipcp_options *wo = &ipcp_wantoptions[unit];
        u32_t a;
        struct hostent *hp;
        
        if (wo->hisaddr == 0 && *p != '!' && *p != '-'
                && strchr(p, '/') == NULL) {
            hp = gethostbyname(p);
            if (hp != NULL && hp->h_addrtype == AF_INET)
                a = *(u32_t *)hp->h_addr;
            else
                a = inet_addr(p);
            if (a != (u32_t) -1)
                wo->hisaddr = a;
        }
    }
#endif
}
#endif

static int ip_addr_check(u32_t addr, struct wordlist *addrs)
{
    
    /* don't allow loopback or multicast address */
    if (bad_ip_adrs(addr))
        return 0;
    
    if (addrs == NULL)
        return !ppp_settings.auth_required;      /* no addresses authorized */
    
    /* XXX All other addresses allowed. */
    return 1;
}

#if 0 /* PAP_SUPPORT > 0 || CHAP_SUPPORT */
/*
 * free_wordlist - release memory allocated for a wordlist.
 */
static void free_wordlist(struct wordlist *wp)
{
    struct wordlist *next;
    
    while (wp != NULL) {
        next = wp->next;
        free(wp);
        wp = next;
    }
}
#endif

#endif /* PPP_SUPPORT */
