⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 auth.c

📁 lwip-1.4.0
💻 C
📖 第 1 页 / 共 3 页
字号:
  int i;  struct protent *protp;  lcp_options *wo = &lcp_wantoptions[unit];  lcp_options *go = &lcp_gotoptions[unit];#if PAP_SUPPORT || CHAP_SUPPORT  lcp_options *ho = &lcp_hisoptions[unit];#endif /* PAP_SUPPORT || CHAP_SUPPORT */  AUTHDEBUG(LOG_INFO, ("link_established: unit %d; Lowering up all protocols...\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  if (go->neg_chap) {    ChapAuthPeer(unit, ppp_settings.our_name, go->chap_mdtype);    auth |= CHAP_PEER;  } #endif /* CHAP_SUPPORT */#if PAP_SUPPORT && CHAP_SUPPORT  else#endif /* PAP_SUPPORT && CHAP_SUPPORT */#if PAP_SUPPORT  if (go->neg_upap) {    upap_authpeer(unit);    auth |= PAP_PEER;  }#endif /* PAP_SUPPORT */#if CHAP_SUPPORT  if (ho->neg_chap) {    ChapAuthWithPeer(unit, ppp_settings.user, ho->chap_mdtype);    auth |= CHAP_WITHPEER;  }#endif /* CHAP_SUPPORT */#if PAP_SUPPORT && CHAP_SUPPORT  else#endif /* PAP_SUPPORT && CHAP_SUPPORT */#if PAP_SUPPORT  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 /* PAP_SUPPORT */  auth_pending[unit] = auth;  if (!auth) {    network_phase(unit);  }}/* * Proceed to the network phase. */static voidnetwork_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  /*   * If we negotiated callback, do it now.   */  if (go->neg_cbcp) {    lcp_phase[unit] = PHASE_CALLBACK;    (*cbcp_protent.open)(unit);    return;  }#endif /* CBCP_SUPPORT */  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");  }}/* @todo: add void start_networks(void) here (pppd 2.3.11) *//* * The peer has failed to authenticate himself using `protocol'. */voidauth_peer_fail(int unit, u16_t protocol){  LWIP_UNUSED_ARG(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 || CHAP_SUPPORT/* * The peer has been successfully authenticated using `protocol'. */voidauth_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 > (int)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'. */voidauth_withpeer_fail(int unit, u16_t protocol){  int errCode = PPPERR_AUTHFAIL;  LWIP_UNUSED_ARG(protocol);  AUTHDEBUG(LOG_INFO, ("auth_withpeer_fail: %d proto=%X\n", unit, protocol));  if (passwd_from_file) {    BZERO(ppp_settings.passwd, MAXSECRETLEN);  }  /*   * 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.   */  pppIOCtl(unit, PPPCTLS_ERRCODE, &errCode);  lcp_close(unit, "Failed to authenticate ourselves to peer");}/* * We have successfully authenticated ourselves with the peer using `protocol'. */voidauth_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 /* PAP_SUPPORT || CHAP_SUPPORT *//* * np_up - a network protocol has come up. */voidnp_up(int unit, u16_t proto){  LWIP_UNUSED_ARG(unit);  LWIP_UNUSED_ARG(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. */voidnp_down(int unit, u16_t proto){  LWIP_UNUSED_ARG(unit);  LWIP_UNUSED_ARG(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. */voidnp_finished(int unit, u16_t proto){  LWIP_UNUSED_ARG(unit);  LWIP_UNUSED_ARG(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");  }}/* * check_idle - check whether the link has been idle for long * enough that we can shut it down. */static voidcheck_idle(void *arg){  struct ppp_idle idle;  u_short itime;    LWIP_UNUSED_ARG(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 voidconnect_time_expired(void *arg){  LWIP_UNUSED_ARG(arg);  AUTHDEBUG(LOG_INFO, ("Connect time expired\n"));  lcp_close(0, "Connect time expired");   /* Close connection */}#if 0 /* UNUSED *//* * auth_check_options - called to check authentication options. */voidauth_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 /* UNUSED *//* * 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. */voidauth_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/* * 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. */u_charcheck_passwd( int unit, char *auser, int userlen, char *apasswd, int passwdlen, char **msg, int *msglen){#if 1 /* XXX Assume all entries OK. */  LWIP_UNUSED_ARG(unit);  LWIP_UNUSED_ARG(auser);  LWIP_UNUSED_ARG(userlen);  LWIP_UNUSED_ARG(apasswd);  LWIP_UNUSED_ARG(passwdlen);  LWIP_UNUSED_ARG(msglen);  *msg = (char *) 0;  return UPAP_AUTHACK;     /* XXX Assume all entries OK. */#else  u_char 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. */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -