vtysh_user.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:4k
源码类别:

网络

开发平台:

Unix_Linux

  1. /* User authentication for vtysh.
  2.  * Copyright (C) 2000 Kunihiro Ishiguro
  3.  *
  4.  * This file is part of GNU Zebra.
  5.  *
  6.  * GNU Zebra is free software; you can redistribute it and/or modify it
  7.  * under the terms of the GNU General Public License as published by the
  8.  * Free Software Foundation; either version 2, or (at your option) any
  9.  * later version.
  10.  *
  11.  * GNU Zebra is distributed in the hope that it will be useful, but
  12.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
  18.  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  19.  * 02111-1307, USA.  
  20.  */
  21. #include <zebra.h>
  22. #include <pwd.h>
  23. #ifdef USE_PAM
  24. #include <security/pam_appl.h>
  25. #include <security/pam_misc.h>
  26. #endif /* USE_PAM */
  27. #include "memory.h"
  28. #include "linklist.h"
  29. #include "command.h"
  30. #ifdef USE_PAM
  31. static struct pam_conv conv = 
  32. {
  33.   misc_conv,
  34.   NULL
  35. };
  36. int
  37. vtysh_pam (char *user)
  38. {
  39.   int ret;
  40.   pam_handle_t *pamh = NULL;
  41.   /* Start PAM. */
  42.   ret = pam_start("zebra", user, &conv, &pamh);
  43.   /* printf ("ret %dn", ret); */
  44.   /* Is user really user? */
  45.   if (ret == PAM_SUCCESS)
  46.     ret = pam_authenticate (pamh, 0);
  47.   /* printf ("ret %dn", ret); */
  48.   
  49. #if 0
  50.   /* Permitted access? */
  51.   if (ret == PAM_SUCCESS)
  52.     ret = pam_acct_mgmt (pamh, 0);
  53.   printf ("ret %dn", ret);
  54.   if (ret == PAM_AUTHINFO_UNAVAIL)
  55.     ret = PAM_SUCCESS;
  56. #endif /* 0 */
  57.   
  58.   /* This is where we have been authorized or not. */
  59. #ifdef DEBUG
  60.   if (ret == PAM_SUCCESS)
  61.     printf("Authenticatedn");
  62.   else
  63.     printf("Not Authenticatedn");
  64. #endif /* DEBUG */
  65.   /* close Linux-PAM */
  66.   if (pam_end (pamh, ret) != PAM_SUCCESS) 
  67.     {
  68.       pamh = NULL;
  69.       fprintf(stderr, "vtysh_pam: failed to release authenticatorn");
  70.       exit(1);
  71.     }
  72.   return ret == PAM_SUCCESS ? 0 : 1;
  73. }
  74. #endif /* USE_PAM */
  75. struct user
  76. {
  77.   char *name;
  78.   u_char nopassword;
  79. };
  80. struct list *userlist;
  81. struct user *
  82. user_new ()
  83. {
  84.   struct user *user;
  85.   user = XMALLOC (0, sizeof (struct user));
  86.   memset (user, 0, sizeof (struct user));
  87.   return user;
  88. }
  89. void
  90. user_free (struct user *user)
  91. {
  92.   XFREE (0, user);
  93. }
  94. struct user *
  95. user_lookup (char *name)
  96. {
  97.   struct listnode *nn;
  98.   struct user *user;
  99.   LIST_LOOP (userlist, user, nn)
  100.     {
  101.       if (strcmp (user->name, name) == 0)
  102. return user;
  103.     }
  104.   return NULL;
  105. }
  106. void
  107. user_config_write ()
  108. {
  109.   struct listnode *nn;
  110.   struct user *user;
  111.   LIST_LOOP (userlist, user, nn)
  112.     {
  113.       if (user->nopassword)
  114. printf (" username %s nopasswordn", user->name);
  115.     }
  116. }
  117. struct user *
  118. user_get (char *name)
  119. {
  120.   struct user *user;
  121.   user = user_lookup (name);
  122.   if (user)
  123.     return user;
  124.   user = user_new ();
  125.   user->name = strdup (name);
  126.   listnode_add (userlist, user);
  127.   return user;
  128. }
  129. DEFUN (username_nopassword,
  130.        username_nopassword_cmd,
  131.        "username WORD nopassword",
  132.        "n"
  133.        "n"
  134.        "n")
  135. {
  136.   struct user *user;
  137.   user = user_get (argv[0]);
  138.   user->nopassword = 1;
  139.   return CMD_SUCCESS;
  140. }
  141. int
  142. vtysh_auth ()
  143. {
  144.   struct user *user;
  145.   struct passwd *passwd;
  146.   passwd = getpwuid (geteuid ());
  147.   user = user_lookup (passwd->pw_name);
  148.   if (user && user->nopassword)
  149.     /* Pass through */;
  150.   else
  151.     {
  152. #ifdef USE_PAM
  153.       if (vtysh_pam (passwd->pw_name))
  154. exit (0);
  155. #endif /* USE_PAM */
  156.     }
  157.   return 0;
  158. }
  159. void
  160. vtysh_user_init ()
  161. {
  162.   userlist = list_new ();
  163.   install_element (CONFIG_NODE, &username_nopassword_cmd);
  164. }