Annotation of embedaddon/quagga/vtysh/vtysh_user.c, revision 1.1

1.1     ! misho       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: 
        !            22: #include <zebra.h>
        !            23: #include <lib/version.h>
        !            24: 
        !            25: #include <pwd.h>
        !            26: 
        !            27: #ifdef USE_PAM
        !            28: #include <security/pam_appl.h>
        !            29: #ifdef HAVE_PAM_MISC_H
        !            30: #include <security/pam_misc.h>
        !            31: #endif
        !            32: #ifdef HAVE_OPENPAM_H
        !            33: #include <security/openpam.h>
        !            34: #endif
        !            35: #endif /* USE_PAM */
        !            36: 
        !            37: #include "memory.h"
        !            38: #include "linklist.h"
        !            39: #include "command.h"
        !            40: 
        !            41: #ifdef USE_PAM
        !            42: static struct pam_conv conv = 
        !            43: {
        !            44:   PAM_CONV_FUNC,
        !            45:   NULL
        !            46: };
        !            47: 
        !            48: int
        !            49: vtysh_pam (const char *user)
        !            50: {
        !            51:   int ret;
        !            52:   pam_handle_t *pamh = NULL;
        !            53: 
        !            54:   /* Start PAM. */
        !            55:   ret = pam_start(QUAGGA_PROGNAME, user, &conv, &pamh);
        !            56:   /* printf ("ret %d\n", ret); */
        !            57: 
        !            58:   /* Is user really user? */
        !            59:   if (ret == PAM_SUCCESS)
        !            60:     ret = pam_authenticate (pamh, 0);
        !            61:   /* printf ("ret %d\n", ret); */
        !            62:   
        !            63: #if 0
        !            64:   /* Permitted access? */
        !            65:   if (ret == PAM_SUCCESS)
        !            66:     ret = pam_acct_mgmt (pamh, 0);
        !            67:   printf ("ret %d\n", ret);
        !            68: 
        !            69:   if (ret == PAM_AUTHINFO_UNAVAIL)
        !            70:     ret = PAM_SUCCESS;
        !            71: #endif /* 0 */
        !            72:   
        !            73:   /* This is where we have been authorized or not. */
        !            74: #ifdef DEBUG
        !            75:   if (ret == PAM_SUCCESS)
        !            76:     printf("Authenticated\n");
        !            77:   else
        !            78:     printf("Not Authenticated\n");
        !            79: #endif /* DEBUG */
        !            80: 
        !            81:   /* close Linux-PAM */
        !            82:   if (pam_end (pamh, ret) != PAM_SUCCESS) 
        !            83:     {
        !            84:       pamh = NULL;
        !            85:       fprintf(stderr, "vtysh_pam: failed to release authenticator\n");
        !            86:       exit(1);
        !            87:     }
        !            88: 
        !            89:   return ret == PAM_SUCCESS ? 0 : 1;
        !            90: }
        !            91: #endif /* USE_PAM */
        !            92: 
        !            93: struct vtysh_user
        !            94: {
        !            95:   char *name;
        !            96:   u_char nopassword;
        !            97: };
        !            98: 
        !            99: struct list *userlist;
        !           100: 
        !           101: struct vtysh_user *
        !           102: user_new ()
        !           103: {
        !           104:   return XCALLOC (0, sizeof (struct vtysh_user));
        !           105: }
        !           106: 
        !           107: void
        !           108: user_free (struct vtysh_user *user)
        !           109: {
        !           110:   XFREE (0, user);
        !           111: }
        !           112: 
        !           113: struct vtysh_user *
        !           114: user_lookup (const char *name)
        !           115: {
        !           116:   struct listnode *node, *nnode;
        !           117:   struct vtysh_user *user;
        !           118: 
        !           119:   for (ALL_LIST_ELEMENTS (userlist, node, nnode, user))
        !           120:     {
        !           121:       if (strcmp (user->name, name) == 0)
        !           122:        return user;
        !           123:     }
        !           124:   return NULL;
        !           125: }
        !           126: 
        !           127: void
        !           128: user_config_write ()
        !           129: {
        !           130:   struct listnode *node, *nnode;
        !           131:   struct vtysh_user *user;
        !           132: 
        !           133:   for (ALL_LIST_ELEMENTS (userlist, node, nnode, user))
        !           134:     {
        !           135:       if (user->nopassword)
        !           136:        printf (" username %s nopassword\n", user->name);
        !           137:     }
        !           138: }
        !           139: 
        !           140: struct vtysh_user *
        !           141: user_get (const char *name)
        !           142: {
        !           143:   struct vtysh_user *user;
        !           144:   user = user_lookup (name);
        !           145:   if (user)
        !           146:     return user;
        !           147: 
        !           148:   user = user_new ();
        !           149:   user->name = strdup (name);
        !           150:   listnode_add (userlist, user);
        !           151: 
        !           152:   return user;
        !           153: }
        !           154: 
        !           155: DEFUN (username_nopassword,
        !           156:        username_nopassword_cmd,
        !           157:        "username WORD nopassword",
        !           158:        "\n"
        !           159:        "\n"
        !           160:        "\n")
        !           161: {
        !           162:   struct vtysh_user *user;
        !           163:   user = user_get (argv[0]);
        !           164:   user->nopassword = 1;
        !           165:   return CMD_SUCCESS;
        !           166: }
        !           167: 
        !           168: int
        !           169: vtysh_auth ()
        !           170: {
        !           171:   struct vtysh_user *user;
        !           172:   struct passwd *passwd;
        !           173: 
        !           174:   passwd = getpwuid (geteuid ());
        !           175: 
        !           176:   user = user_lookup (passwd->pw_name);
        !           177:   if (user && user->nopassword)
        !           178:     /* Pass through */;
        !           179:   else
        !           180:     {
        !           181: #ifdef USE_PAM
        !           182:       if (vtysh_pam (passwd->pw_name))
        !           183:        exit (0);
        !           184: #endif /* USE_PAM */
        !           185:     }
        !           186:   return 0;
        !           187: }
        !           188: 
        !           189: void
        !           190: vtysh_user_init ()
        !           191: {
        !           192:   userlist = list_new ();
        !           193:   install_element (CONFIG_NODE, &username_nopassword_cmd);
        !           194: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>